Hallo liebe Gemeinde, ich habe schon so einiges gesucht, aber irgendwie nicht das richte gefunden. Ich habe ein Barcodemodul an die UART0 vom ATMega 644 angeschlossen und parallen mein DSO mit integr. RS232-konverter. Das BC-Modul schickt raus was es liest und am µC kommt auch was an. Ich möchte einfach den empfangenen String (im Moment auf 10 Zeichen begrenzt) speichern. Vielleicht funzt es so schon, aber ich kann es nicht kontrollieren, da ich die Variable string nicht "watchen" kann, es kommt im Watchfenster die meldung, das der Typ unbekannt ist (AVR-Studio 6, STK600, JTAGICE3) Kann mir jmd helfen? (ist erstmal alles ohne ISR....) int main(void) { char string[30]; uint8_t puffer=0; uint8_t i=0; serial_init(); while(i<10) { if(( UCSR0A & (1<<RXC0) )) { string[i]=UDR0; i++; } } }
Heiko K. schrieb: > Kann mir jmd helfen? warum nicht einfach mal eine LED einschalten wenn etwas empfangen wurde.
1 | string[i]=UDR0; |
2 | i++; |
3 | porta = i; |
Vermutlich schickt der Leser am ende ein \n, damit kannst du prüfen ob etwas empfangen wurden.
Habe ich gemacht, i wird hoch gezählt mit jedem eingescannten Barcode, aber in 2er schritten! Also 2,4,6,8,10 die LSB-LED auf dem STK blinkt nur ganz kurz auf als ob das Barcodemodul gleich zwei Strings hintereinander sendet. while(i<10) { if(( UCSR0A & (1<<RXC0) )) { string[i]=UDR0; i++; PORTA=~i; }
nun weis ich leider noch nicht was in der variablen "string" nun am ende gespeichert ist...
Also das Problem mit den zweierschritten ist geklärt, der Barcode hatte 8 Zahlen (EAN8) und der Scanner hat noch ein Zeichen dran gehängt und somit war das UDR Register voll. Habe das anhängen von Zeichen am Modul deaktiviert. Hat jmd ne idee wie ich den Inhalt von "string" im AVR sichtbar mache?
Heiko K. schrieb: > Also das Problem mit den zweierschritten ist geklärt, der Barcode hatte > 8 Zahlen (EAN8) und der Scanner hat noch ein Zeichen dran gehängt und > somit war das UDR Register voll. Habe das anhängen von Zeichen am Modul > deaktiviert. > > Hat jmd ne idee wie ich den Inhalt von "string" im AVR sichtbar mache? Wenn du gar nichts anderes hast, könntest du die empfangenen Zeichen ins EEPROM schreiben und vom AVR Studio aus den EPROM Inhalt auslesen. Aber einfacher ist es, wenn du dir erst mal eine Anzeigemöglichkeit schaffst. UART zum PC, LCD, was auch immer. Zur Not ginge auch eine Serie von 8 LED, 1 Taster und eine ASCII Tabelle, mit dem du dir die empfangenen Bytes in Binärform ausgeben lassen kannst. Aber das ist schon die absolute Hardcore Variante. Einfacher ist es, in einem Entwicklungssystem ein LCD zur Verfügung zu haben, selbst wenn dieses LCD danach wieder weg kommt, weil es im fertigen Gerät nicht gebraucht wird. Wenn man als Neuling denkt, man könne sich das alles sparen, dann merkt man sehr schnell, das man sich dabei selbst Prügel zwischen die Beine wirft.
:
Bearbeitet durch User
Heiko K. schrieb: > Hat jmd ne idee wie ich den Inhalt von "string" im AVR sichtbar mache? Also: Ich hab Problem nachvollziehen können und eine eventuelle Lösung gefunden. benötigt wird eine temporäre Variable nennen wir sie mal temp
1 | int main(void) |
2 | char temp=0; |
3 | {
|
4 | char string[30]; |
5 | uint8_t puffer=0; |
6 | uint8_t i=0; |
7 | |
8 | serial_init(); |
9 | |
10 | while(i<10) |
11 | {
|
12 | if(( UCSR0A & (1<<RXC0) )) |
13 | {
|
14 | string[i]=UDR0; |
15 | i++; |
16 | }
|
17 | }
|
18 | temp=string[0]; // Hier den Breakpoint setzen |
19 | }
|
Anstatt jetzt die Pause-Taste zu drücken wird ein Breakpoint gesetzt. Auf magische Weise wandelt sich die das "unknow identifier" in den Wert. Warum das so ist, kann ich zugegebenermaßen nur spekulieren... Ersatzweise kannst du dir auch die Adresse des Strings in einen Pointer schreiben, den im Watch angucken und damit dann im Memory-Fenster (Debug->Windows->Memory1) den Inhalt des Speichers an der Adresse ansehen. Da allerdings als Hex während, das im Watch-Fenster auch als Dec dargestellt wird. Ich hoffe das hat geholfen.
:
Bearbeitet durch User
Heiko K. schrieb: > nun weis ich leider noch nicht was in der variablen "string" nun am ende > gespeichert ist... Warum gibst du den String nicht über die serielle Schnittstelle aus und guckst dir das auf dem PC mit einem gescheiten Terminalprogramm (z.B. HTerm) an?
Super Tip, da ich das STK600 nutze war das mit den LED´s nen mini-Umfang. Bei jedem BC-Scan wurde was anderes empfangen und ensprach laut ASCII-Tab nur Blödsinn. Da bin ich stutzig geworden und habe nochmal Baudrate, etc. überprüft. while(i<10) { if(( UCSR0A & (1<<RXC0) )) { string[i]=uart_getc(); i++; PORTA=~i; } } wenn ich jetzt einen BC mit 8 Ziffern scanne wird als Binärcode (via LED´s) auch eine 8 angezeigt! Hat dann wohl geklappt, danke !
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.