Skocz do zawartości
ZaQ_1

MAX7456 duchy na ekranie i zawieszanie programu

Pomocna odpowiedź

Napisano (edytowany)

Siemka, to mój pierwszy post ale pewnie zabawię tu dłużej.

Pracuję nad cyfrowym celownikiem do wiatrówek lub asg. Do generowania krzyża na ekranie postanowiłem użyć płytki minimOSD popularnej w środowiskach latających fpv. Jest to właściwie arduino pro mini i max7456 na jednej płytce. Działać ma w ten sposób, że układ generuje krzyż celowniczy, którego położenie możemy zmienić przyciskami.

W czasie normalnej pracy przyciski są ignorowane, gdyż do flagi ustawienia ładowane jest 0 przy starcie programu. Aby zmienić wartości współrzędnych należy najpierw wcisnąć środkowy przycisk, który zmienia stan zmiennej ustawienia na przeciwny oraz aktualizuje wartości zmiennych x i y w pamięci eeprom. 

Na sucho (to znaczy w terminalu, pracując na samych liczbach) wszystko działa. W pełnym programie kiedy wciskam lewy przycisk wszystko się wiesza. Kolejny problem to duch dolnego fragmentu krzyża. Widać to trochę na filmie:

Program oparłem głównie o przykład helloworld z biblioteki max7456 wspierając się wiadomościami z forbotowego kursu arduino.

  #include <SPI.h>
  #include <MAX7456.h>
  #include <EEPROM.h>

// Pin Mapping /////////////////////////////////////////////////////////////////
  
  // pinValue = 0 means "not connected"

  //  FDTI Basic 5V                   ---  Arduino  VCC      (AVCC,VCC)
  //  FDTI Basic GND                  ---  Arduino  GND      (AGND,GND)
  //  FDTI Basic CTS                  ---  Arduino  GND      (AGND,GND)
  //  FDTI Basic DTR                  ---  Arduino  GRN
  //  FDTI Basic TXO                  ---> Arduino  TXO [PD0](RXD)
  //  FDTI Basic RXI                 <---  Arduino  RXI [PD1](TXD)
  
  //  Max7456 +5V   [DVDD,AVDD,PVDD]  ---  Arduino  VCC      (AVCC,VCC)
  //  Max7456 GND   [DGND,AGND,PGND]  ---  Arduino  GND      (AGND,GND)
  //  Max7456 CS    [~CS]            <---  Arduino  10  [PB2](SS/OC1B)
  //  Max7456 CS    [~CS]            <---  Mega2560 43  [PL6]
  const byte osdChipSelect             =            6; //6 for micro minimosd board
  //  Max7456 DIN   [SDIN]           <---  Arduino  11  [PB3](MOSI/OC2)
  //  Max7456 DIN   [SDIN]           <---  Mega2560 51  [PB2](MOSI)
  const byte masterOutSlaveIn          =                      MOSI;
  //  Max7456 DOUT  [SDOUT]           ---> Arduino  12  [PB4](MISO)
  //  Max7456 DOUT  [SDOUT]           ---> Mega2560 50  [PB3](MISO)
  const byte masterInSlaveOut          =                      MISO;
  //  Max7456 SCK   [SCLK]           <---  Arduino  13  [PB5](SCK)
  //  Max7456 SCK   [SCLK]           <---  Mega2560 52  [PB1](SCK)
  const byte slaveClock                =                      SCK;
  //  Max7456 RST   [~RESET]          ---  Arduino  RST      (RESET)
  const byte osdReset                  =            0;
  //  Max7456 VSYNC [~VSYNC]          -X-
  //  Max7456 HSYNC [~HSYNC]          -X-
  //  Max7456 LOS   [LOS]             -X-

// Global Constants ////////////////////////////////////////////////////////////

  const unsigned long debugBaud = 9600;         // Initial serial baud rate for 
                                                //   Debug PC interface

// Global Variables ////////////////////////////////////////////////////////////
  
  HardwareSerial Debug = Serial;                // Set debug connection
  
  MAX7456 OSD( osdChipSelect );
	

#define key_left 10               //przyciski
#define key_right 9
#define key_up 8
#define key_down 7
#define key_mode 5
int x;                            //wspolrzedne
int y;
boolean ustawienia=0;             //flaga ustawien

// Hardware Setup //////////////////////////////////////////////////////////////

  void setup() 
  {
    unsigned char system_video_in=NULL;  
    // Initialize the Serial connection to the debug computer:
    Debug.begin( debugBaud );
    
    
    // Initialize the SPI connection:
    SPI.begin();
    SPI.setClockDivider( SPI_CLOCK_DIV2 );      // Must be less than 10MHz.
    
    // Initialize the MAX7456 OSD:
    OSD.begin();                                // Use NTSC with default area.
    OSD.setSwitchingTime( 5 );       
    
    system_video_in=OSD.videoSystem();
    if(NULL!=system_video_in)
    {
        OSD.setDefaultSystem(system_video_in) ;
    }
    else
    {
        OSD.setDefaultSystem(MAX7456_NTSC) ;
    }
    
    OSD.display();                              // Activate the text display.
	OSD.setCharEncoding(MAX7456_ASCII);         // Use non-decoded access.
    OSD.noLineWrap();                           // Set wrap behaviour.
    OSD.noPageWrap();

    x = EEPROM.read(1);                //zapis wartosci z eeprom do zmiennej
    y = EEPROM.read(2);  
    //Serial.begin(9600);              //do testow w terminalu
    pinMode(key_left, INPUT_PULLUP);
    pinMode(key_right, INPUT_PULLUP);
    pinMode(key_up, INPUT_PULLUP);
    pinMode(key_down, INPUT_PULLUP);
    pinMode(key_mode, INPUT_PULLUP);

  }
 
// Main Code ///////////////////////////////////////////////////////////////////

  void loop() 
  {
    
    while (OSD.notInVSync());                   // Wait for VSync to start to 
      CrossPrint();                                          
    //while (true);
    if (digitalRead(key_mode) == LOW) 
    {
		ustawienia ^= 1;                      //zmiana stanu flagi ustawien
		//Serial.println("key_mode");         // do testow w terminalu
		EEPROM.update(1, x);                  //zapis do eeprom wartosci zmiennej
		EEPROM.update(2, y);
		while (digitalRead(key_mode) == LOW) { delay(100);}
    }
    if ((digitalRead(key_left) == LOW) && (ustawienia==1))  //jesli stan na key_left niski i flaga ustawien = 1 (wcisniety)
    {
		//Serial.println("key_left");        //wyswietl "key_left"
		x-=1;                                //odejmij 1 i zapisz wynik do zmiennej x
		while (OSD.notInVSync());
		OSD.clear();
		CrossPrint();                        //wyswietl krzyz
		while (digitalRead(key_left) == LOW) { delay(100);} 
      //dopuki key_left wcisniety pozostan w petli bezczynnej. jedno wcisniecie = zmiana x o jedna jednostke
    }
    if ((digitalRead(key_right) == LOW) && (ustawienia==1))
    {
		//Serial.println("key_right");
		x+=1;
		while (OSD.notInVSync());
		OSD.clear();
		CrossPrint();
		while (digitalRead(key_right) == LOW) { delay(100);}
    }
    if ((digitalRead(key_up) == LOW) && (ustawienia==1)) 
    {
		//Serial.println("key_up");
		y-=1;
		while (OSD.notInVSync());
		OSD.clear();
		CrossPrint();
		while (digitalRead(key_up) == LOW) { delay(100);}
    }
    if ((digitalRead(key_down) == LOW) && (ustawienia==1)) 
    {
		//Serial.println("key_down");
		y+=1;
		while (OSD.notInVSync());
		OSD.clear();
		CrossPrint();
		while (digitalRead(key_down) == LOW) { delay(100);}
    }	
  } 

void CrossPrint()
{
    
	OSD.setCursor( (x+4), y );                                            
    OSD.print( "/" );  
    OSD.setCursor( (x+4), (y+1) );                                            
    OSD.print( "/" );    
    OSD.setCursor( x, (y+2) );             
    OSD.print( "----+----" );                   
    OSD.setCursor( (x+4), (y+3) );                                            
    OSD.print( "/" );
    OSD.setCursor( (x+4), (y+4) );                                            
    OSD.print( "/" );  	
}

schemat 1_1.jpg

Edytowano przez Treker
Poprawiłem formatowanie.

Udostępnij ten post


Link to post
Share on other sites

A wiesz dokładnie w którym miejscu program się "wiesza"? Może pododawaj tam jakieś printy albo miganie diodą, żeby wiedzieć.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Problem z zawieszaniem się programu rozwiązany. Okazał się sprzętowy. Chińczyk albo zmienił coś w płytce albo zrobił błąd na schemacie. Skoro na sucho działało to pin musiał być używane do czegoś związanego ze sterowaniem układu max7456. Podłączyłem przycisk na inny wolny pin (z D10 na A1) i zwiechy zniknęły. Z duchami nadal walczę.

 

Edycja:

Problem z duchem częściowo rozwiązałem, choć w bardzo nieładny sposób. Pozbyłem się działań wykonywanych w nawiasie ze współrzędnymi. Działania przeniosłem do dodatkowych zmiennych dla y. Przesunięcie x załatwiłem spacjami. Gdy próbowałem zastąpić x+4 zmienną x1=(x+4) zaczął się pojawiać w górnym fragmencie krzyża. Muszę chyba zagłębić się bardziej w inne przykłady z biblioteki bo mój sposób rysowania krzyża wydaje się być daleki od optymalnego.

void CrossPrint()
{
	int y1=(y+1);
	int y2=(y+2);
	int y3=(y+3);
	int y4=(y+4);
	OSD.setCursor( x, y );                                            
	OSD.print( "    /" );  
	OSD.setCursor( x, y1 );                                            
	OSD.print( "    /" );    
	OSD.setCursor( x, y2 );             
	OSD.print( "----+----" );                   
	OSD.setCursor( x, y3 );                                            
	OSD.print( "    /" );
	OSD.setCursor( x, y4 );                                            
	OSD.print( "    /" );  	
}

 

Edytowano przez ZaQ_1
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...