Hallo, ja ich bin ein Anfänger und habe mich bereits hier in den Foren umgeschaut. Beschreibung: STK 500 und Windows Rechner 7(64) verbunden über USB / 232 Adapter. Hab ich, wie hier im Forum beschrieben getestet und paßt. Auch die Programmierung funktioniert. Hardwareseitig ist da noch ein Baudratenquartz mit 1,8432 MHz, Jumper sind gesetzt und an XTAL 1 kommen die 1,843 MHz auch an. Weiters habe ich das STK500 mit einem ATtiny2313 bestückt. Die Fusebits sind auf extern Osc mit 0.9 bis 3 MHZ 14CK 65ms. DIV/8 ist nicht aktiv, ansonsten ist nur bei HIGH.SPIEN der Haken gesetzt. Den Code hab ich an den 2313 angepasst und da komm ich einfach nicht weiter. Was festzustellen ist, dass beim Ein / Ausschalten des Boards ein Zeichen (meistens das gleiche) am Terminal ausgegeben wird. Möglicherweise ist das für Fachleute ein Hinweis. Frage1: Wenn ich im Simulator den Code durchgehe dann werden in manchen Registern die Werte nicht angezeigt z.B. in UDR, - Was könnte die Ursache sein ? Frage2: Beim Durchlauf des Programms werden die Zeichen nacheinander nach UDR geschoben. Allerdings funktioniert das immer nur bis zum 3. Zeichen, danach wird UDRE nicht mehr hochgesetzt, entsprechend läuft das Programm in der Endlosschleife und wartet auf UDRE - Gibt es dafür eine Erklärung ? Frage3: Wo kann ich nachsehen ob z.B. der 2313 nicht nur im Simulationsmodus sondern auch auf der Hardwareseite im Debugmodus läuft ? Bin natürlich für alle Hinweise dankbar und hoffe dass ich soweit die Umgegung und möglich Fehlerquellen bereits ausreichend beschrieben habe. Vielen Dank !
Rudolf M. schrieb: > Was festzustellen ist, dass beim Ein / Ausschalten des Boards ein > Zeichen (meistens das gleiche) am Terminal ausgegeben wird. > Möglicherweise ist das für Fachleute ein Hinweis. Ein Hinweis darauf, dass die Hardware zumindest leicht suboptimal ist. Aber die normale Funktion der UART-Schnittstelle wird durch diesen "Einschalteffekt" nicht gestört. Nur die Software muss natürlich damit klarkommen, dass der Gegenüber auch mal Müll produzieren kann. Das löst man über die Verwendung geeigneter Protokolle. > Frage1: Wenn ich im Simulator den Code durchgehe dann werden in manchen > Registern die Werte nicht angezeigt z.B. in UDR, - Was könnte die > Ursache sein ? Der Simulator ist weit davon weg, perfekt zu sein. Insbesondere auch UDR ist schlecht auf der Oberfläche abgebildet, denn diese Abbildung trägt in keinster Weise der Tatsache Rechnung, dass UDR eigentlich vier Register sind, von denen immerhin zwei unter dem Namen UDR wirklich ansprechbar sind, allerdings eins halt nur schreibend und eins nur lesend. > Frage2: Beim Durchlauf des Programms werden die Zeichen nacheinander > nach UDR geschoben. Allerdings funktioniert das immer nur bis zum 3. > Zeichen, danach wird UDRE nicht mehr hochgesetzt, entsprechend läuft das > Programm in der Endlosschleife und wartet auf UDRE - Gibt es dafür eine > Erklärung ? Ja: Dein Programm macht Mist. Es schreibt häufiger auf UDR, als es dürfte. Sprich: es schreibt auch zu Zeitpunkten, wenn UDRE nicht gesetzt ist. Genau solche fehlerhaften Programme erzeugen dieses (nur scheinbare!) Fehlerbild. Wenn man richtig debuggen kann, kann man übrigens auch sichtbar machen, was da tatsächlich passiert... > Frage3: Wo kann ich nachsehen ob z.B. der 2313 nicht nur im > Simulationsmodus sondern auch auf der Hardwareseite im Debugmodus > läuft. Nirgendwo. Es gibt nämlich überhaupt keinen "Debugmodus" beim AVR8. Oder hast du in irgendeinem Datenblatt einen solchen auch nur erwähnt gefunden? Tja, das liegt, wie gesagt, daran, dass es keinen gibt. Entweder läuft das Teil oder es steht. Dazwischen gibt's nix.
Hi @Rudolf, kannst Du den verwendeten Code posten? Wenn es möglich ist, in *.asm. Dann kann ich 'mal schauen. (Die Reihe von "gängigen" Fehlerquellen hat @Falk ja schon gelinkt.) Bei mir war es tatsächlich ein falscher Beispiel-Code-Schnipsel in der ATMEL Doku. beim Portieren vom ATiny 2313 auf ATmega32U2. Also habe hier ein UART-Proggi für den 2313 vorliegen. Könnte dann direkt vergleichen. Vorab bitte schon selber einmal prüfen, wie der UART tatsächlich initialisiert wird. Welches Include-File (def.inc) wurde tatsächlich verwendet? ("tn2313def.inc" oder "2313def.inc") Manchmal ändern sich die Bezeichnungen für die Register. Beispiel: .equ USR = UCSRA ; For compatibility .equ UCR = UCSRB ; For compatibility ok. ciao gustav P.S.: Port D hat ein Bit weniger, also PD0 bis PD6 nicht PD7. Wenn die Pullups auch für RXD-Eingang gesetzt werden sollen, macht er es mit 0x7F und nicht mit 0xFE wie im Code oben angegeben. OK?
:
Bearbeitet durch User
Hallo, wenn man einen Quarz verwendet, dann sollte man nicht "extern Osc." einstellen, das ist eine andere Baugruppe.
Karl M. schrieb: > Hallo, > > wenn man einen Quarz verwendet, dann sollte man nicht "extern Osc." > einstellen, das ist eine andere Baugruppe. Hi, hab auch testweise ein 4,096 MHz "Baudraten"-Quarz drin. Aber Fuses auf Ext. Oszi. Bist Du Dir mit deiner Einschätzung oben sicher? ciao gustav P.S.: Ähh, da ist noch das FE drin soll doch 7F heissen.
:
Bearbeitet durch User
Wenn das UART-Beispiel nicht läuft, geh' doch mal zurück zum Standard Hello World-Programm. Da blinkt zwar nur eine LED, aber so kannst Du den ganzen Rest (Compilerinstallation, Verbindung zum STK, Brenner) erst mal überprüfen. Erst wenn "super simpel" läuft, kannst Du was Weitergehendes überprüfen.
es gibt einen grossen unterschied ob xtal oder osc am AVR hängen. wenn du die einstellung ext. osc nimmst, sollte die pufferstuffe im avr ausgeschaltet sein und die takterzeugung mit einem quarz funktioniert nicht! evtl. geht der avr dann zurück auf den internen takt, das weiss ich aber nicht. wenn du einen quarz verwendest stell sicher, dass der interne puffer des avr's auch aktiviert und der oszillator eingeschwungen ist. kann in den fuses mittels einschwingzeit eingestellt werden. gruess
soundso schrieb: > es gibt einen grossen unterschied ob xtal oder osc am AVR hängen. Hi, ok. ok. Siehe Bild. ciao gustav P.S.: Quarz hat 4.096 MHz
Hallo, beim STK500 ist es ein externer Oszillator. Aber: bei allen von mir gemutzten AVR (2313/8515/Mega8/16/32 usw.) geht die Einstellung "ext. Quarz" zuverlässig. Ich habe die AVR üblicherweise so gefused auch auf dem STK so benutzt, damit ich auf der externen Schaltung mit Quarz die Fuses schon passend hatte. Gruß aus Berlin Michael
Zunächst mal vielen Dank an alle die sich die Mühe machen mir zu antworten. Den Code habe ich unten angeschlossen, wie gesagt es ist das Beispiel aus dem Tutorial mit den Änderungen die ich wegen des Wechsels vom atmega8 auf den ATtiny2313 gemacht habe. Den Originalcode hab ich hinter ein Semikolon gestellt um einen Vergleich zu haben. Im übrigen, hier im Forum kann man auch den Code formatieren wie ich sehe .... nur ich ... ein Tip zum how to wäre hilfreich. Die Beiträge bezüglich externer Quarz. Ich fürchte ich war da etwas zu schwammig. Eingestellt habe ich Ext. Crystal Osc 0.9 - 3.0 MHz 14CK + 65ms. Nach dem was ich darüber gelesen habe, müßte das eigentlich passen. Der Tip bezüglich "Hello World" ist absolut nachvollziehbar, ich hab das Tut von Anfang an durchgearbeitet und bis dato hat das auch funktioniert. avrasm ; .include "m8def.inc"; .include "tn2313def.inc" .def temp = r16 ; Register für kleinere Arbeiten .def zeichen = r17 ; in diesem Register wird das Zeichen an die ; Ausgabefunktion übergeben ;.equ F_CPU = 4000000 ; Systemtakt in Hz .equ F_CPU = 1843200 ; Quarzfrequenz .equ BAUD = 9600 ; Baudrate ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif ; Stackpointer initialisieren ;ldi temp, HIGH(RAMEND) ;out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ; Baudrate einstellen ldi temp, HIGH(UBRR_VAL) out UBRRH, temp ldi temp, LOW(UBRR_VAL) out UBRRL, temp ; lt. Datenblatt Seite 134 - "11" ; Frame-Format: 8 Bit ; ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0) ldi temp, (1<<UCSZ1)|(1<<UCSZ0) ; lt. Datenblatt Seite 132 out UCSRC, temp sbi UCSRB,TXEN ; TX aktivieren loop: ldi zeichen, 'T' rcall serout ; Unterprogramm aufrufen ldi zeichen, 'e' rcall serout ; Unterprogramm aufrufen ldi zeichen, 's' rcall serout ; ... ldi zeichen, 't' rcall serout ldi zeichen, '!' rcall serout ldi zeichen, 10 rcall serout ldi zeichen, 13 rcall serout rcall sync rjmp loop serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, zeichen ret ; zurück zum Hauptprogramm ; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich ; das Kabel getrennt wurde sync: ldi r16,0 sync_1: ldi r17,0 sync_loop: dec r17 brne sync_loop dec r16 brne sync_1 ret /avrasm
Ist der USB/RS232-Adpater direkt an die PortPins angeschlossen oder an die 9-pol. SubDBuchse? Wenn letzeres der Fall ist, müssen die beiden TXD und RXD(RS232 SPARE) über den LEDs mit den jeweiligen PortPins des Prozessors verbunden werden. Anderfalls ist die SubDBuchse nicht an den Prozessor angeschlossen.
Welchen Wert hat das Fuse Low Byte? CKDIV8 muss 'unprogrammed' sein.
VIELEN DANK ! so ist das mit den Anfängern ... Es funktioniert ! (nur der Zeilenvorschub wird nicht durchgeführt, sondern ein exotisches Zeichen, aber das wird wohl selbst zu finden sein :-) ) Dank an alle, die sich am Thema beteiligt haben !
Nachfrage zum Thema richtig debuggen - ist hier ein Beitrag (Tut o.ä. ) besonders zu empfehlen ?
Hi, erst einmal Glückwunsch! (Also mit der 2313def.inc geht's bei mir nicht.) Du hast ja schon die "aktuellere" tn2313def.inc genommen. OK. Die nimmt UCSRA etc... Und auch Glückwunsch, dass die automatische Baudratenberechnung so auf Anhieb geklappt hat. Das funktioniert manchmal eben auch nicht. In dem Falle müsste man eben den Wert selbst errechnen und direkt eintragen. Nun zur Frage: Rudolf M. schrieb: > m übrigen, hier im Forum kann man > auch den Code formatieren wie ich sehe .... nur ich ... ein Tip zum how > to wäre hilfreich. Lade das *.asm-File in einen Texteditor und speichere es unter "alle Dateien" mit Endung *.asm ab. Dann lade es so hier als Attachment hoch. Die Forensoftware erledigt alles andere von selbst. ciao gustav
Rudolf M. schrieb: > (nur der Zeilenvorschub wird nicht durchgeführt, > sondern ein exotisches Zeichen, aber das wird wohl selbst zu finden sein Hi, die ASCII-Zeichen in hex sehen so aus: ldi temp, 0x0A; Zeilenvorschub (line feed /LF) ldi temp, 0x0D; Wagenrücklauf (carriage return /CR ...oder "nur" ENTER) Es hängt auch von den Terminaleinstellungen ab. Ich benutze Teraterm. ciao gustav
:
Bearbeitet durch User
Hi @Rudolf, probier doch einmal das angehängte Proggi aus: Es liefert mir bei Teraterm das dazugehörige Bild. Also, es soll kein "Fließtext" entstehen, sondern definitiv an den Anfang der Zeile gesprungen, dann eine Leerzeile eingefügt werden und der Cursor sogar auf den Anfang derselben Zeile hier Text Zeile 2 (obwohl es ja Zeile 3 ist) springen. Und das abhängig von den als Tabelleneinträge gesetzten Steuerzeichen. Das Problem entsteht mit dem Padding byte mismatch, von daher braucht man sich nicht über "1 warning" zu wundern. Aber das ist ja bei Nullterminierung - eben daher die "0" am Ende der Tabelle noch - wohl immer so. (Ok. ok. Das kommt später sicher noch ausführlicher.) ciao gustav
Hallo @Gustav, sorry für die späte Antwort, ich komm einfach nicht so oft dazu mich meinem (neuen) Hobby zu widmen. Ich werde das natürlich probieren, ich selber benutze derzeit HTerm und AccessPort als Terminalprogramme. Zwei deswegen, damit ich eventuelle Unterschiede an der "Empfangsstelle" orten kann. Danke und bis bald Rudolf
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.