Hallo,
ich benutze aktuell den Atmega 644 und bin in C gleich einmal daran
gescheitert die Signale an Port A auszugeben.
Setze ich nämlich mit
1
PORTA=255
leuchten alle LEDs wies sein soll, blöd ist nur ich krieg sie nichtmehr
aus. Jede direkte Zuweisung scheint final zu sein. Das einzigste was
funktioniert ist die Zuweisung über ein ExOr nur das setzt voraus das
ich davor alle LEDs nochmal auf 0 gesetzt habe, ist also nicht wirklich
praktikabel. Was mach ich falsch??
Hier der code benutze die UART bib von peter fleury läuft 1a:
EAGLE schrieb:> if(empfangen==1){> PORTA = 0b00000001;
Was schickst du dem uC?
Sicher dass du in die Zweige der Abfragen reinkommst?
Weil das Ascii-Zeichen '1' ist nicht das selbe wie 1.
:-)
Was liefert uart_getc? Doch sicherlich das von Dir über die serielle
Schnittstelle an den µC gesendete Zeichen.
Wenn Du das aber auswerten willst, dann musst Du dessen ASCII-Code
oder eben das Zeichen auswerten.
Du aber vergleichst dieses Zeichen mit den numerischen Werten 1 bis 5
- das sind die ASCII-Codes von Steuerzeichen, die Du im Terminalprogramm
nur umständlich durch Drücken von CTRL+A bis CTRL+E eingeben kannst.
Ändere das und vergleiche empfangen mit den Konstanten '1' bis '5'.
Das sind Zeichen.
leuchten alle LEDs wies sein
> soll, blöd ist nur ich krieg sie nichtmehr aus. Jede direkte Zuweisung> scheint final zu sein.
Un dfür die Zukunft:
Beim Testen testet man immer die einfachste Variante.
In deinem Code fallen mir auf Anhieb 3 andere Dinge ein, die genausogut
schief gehen können und die absolut nichts mit den Ports an sich, und
dass eine Zuweisung 'final' wäre, zu tun haben.
Wie willst du unterscheiden, welcher dieser mindestens 3 möglichen
Fehler vorliegt, wenn du nicht systematisch vorgehst?
Also danke erstma für die schnellen Antworten.
Ich sende sicher ein zahl (0-255) da ich das Programm zum senden selber
geschrieben hab (java) und es mit dem Atmega 322 auch funktioniert.
Du schreibst, die Leds "würden" ewig leuchten in deinem letzten
Beispiel. Heißt das jetzt, dass du das getestet hast, mit exakt dem
Beispiel? Oder nimmst du das einfach nur grad mal so an?
Also falls sich das mit deinem einfachen Beispiel, ausschlieslich
bestehend aus DDR-Initialisierung, Port schreiben, Schleife und darin
wieder Port schreiben so verhält, dass die Leds an bleiben ist was
ernsthaft faul. Das sollte so nicht sein. Falls dem so ist brauchen wir
alle Infos zum Aufbau. Was für ein Controller auf was für einem Board,
Schaltplan, Foto und/oder Layout von der Platine. Auch Compiler und
dessen Einstellungen.
Ich kenne jetzt die UART Bibliothek nicht, aber ich vermute, dass
while(1==1){
empfangen=uart_getc();
PORTA = empfangen;
}
immer 0 liefert. Nur wenn ein Zeichen kommt, wird das ganz kurz am Port
"angezeigt". Danach kommt sofort wieder der IDLE Wert 0 zum tragen! Das
heißt, für dich siehts immer nach ner 0 aus.
Wie gesagt, nur eine Vermutung.
Mir ist da grad noch was aufgefallen. Es sieht so aus als würdest du die
UART Library von Peter Fleury verwenden. Bei dieser Bibliothek kannst du
aber nicht blind die empfangen Daten per uart_getc() abrufen.
Die Funktion uart_getc() wartet nicht auf Daten vom UART. Der Aufruf
kommt sofort zurück, das Ergebnis ist ein 16bit-Wert. In den oberen acht
Bit wird mit Flags signalisiert, was von den unteren acht Bit zu halten
ist. Das wird bei dir in den meisten Fällen das Flag für "es gibt keine
Daten aus dem UART-Puffer abzuholen" sein. Was da dann genau mit den
unteren acht Bit ist, kann ich dir nicht sagen, aber gültige Daten
müssen das auf keinen Fall sein, wenn dir die Flags das nicht eben auch
signalisieren.
Naja, das ist ja genau das was ich meine. Du kannst nicht einfach
uart_getc() aufrufen und hoffen das da immer Daten vom UART
zurückgegeben werden. Du musst schon noch wie im Beispiel die Flags
prüfen. Bei den meisten Aufrufen wird dir uart_getc() eben das
UART_NO_DATA-Flag zurückgeben und du weißt damit, dass eben keine Daten
empfangen wurden, sprich der Empfangspuffer leer ist.
In den Fall solltest du aber auch nicht die unteren acht Bit des
Rückgabewertes verwenden und irgendwo zuweisen, da das keine gültigen
Daten vom UART sein müssen.