Hallo Ich habe ein Programm geschrieben mit dem ich übers Terminal ein Zeichen sende das auf den PortB ausgeben und ans Terminal zurücksende. Leider geht nichts beim simulieren (wenn ichs richtig mache) springt er beim sobald sich im Uart 7RXC ändert in die Reset Routine. Seit dem ich nicht mer mit 8515 sondern mit Mega16 arbeite habe ich problem mit dem Empfangsinterrupt. Wer sieht das Problem ? Gruss
Hallo Jens Der Stackpoint ist doch so initialisiert oder sehe ich das Falsch? ldi Temp, LOW(RAMEND) out SPL, Temp ;Setzt Stackpointer LowByte ldi Temp, HIGH(RAMEND) out SPH, Temp ;Setzt Stackpointer HighByte Das habe ich imme so gemacht. Gruss Weihnachtsmann
Kann es sein, dass du UBRR nicht richtig initialisierst? Normalerweise ist es ein 16Bit-Register, das aus UBRRH und UBRRL besteht. Und man muss erst UBRRH (meist 0) und dann UBRRL übergeben. Steht irgendwo im Datenblatt beschrieben... Gruß Rahul
Geht auch nicht Also ich habe ldi Temp,UBRRVAL ;Baudrate einstellen out UBRR,Temp ersetzt durch: ldi Temp, HIGH(UBRRVAL) ;Baudrate einstellen out UBRRH, Temp ldi Temp, Low(UBRRVAL) out UBRRL, Temp Viele beispiele die ich sehe ist aber Low zuerst.
Kann sein dass mit dem Interruptvector was nicht stimmt. Denn wenn beim Simulieren wenn ich einen Interrupt auslöse Springt er zu reti ;Analog Comparator Handle und dann zu: jmp Reset ;Reset Handler Und dann arbeitet er wieder "Reset" ab. Ich sehe nicht mehr durch
lass doch mal das "rcall SerOut" weg. Es ist immer ungünstig aus einer Interrupt-Prozedur noch wieder eine andere aufzurufen (zumindest in C...). Interrupt-Routinen sollten immer möglichst kurz gehalten werden.
Deine Interrupttabelle am Anfang des Programms funktioniert nur bei AVR mit kleinem Speicher. RETI ist ein 2Byte-Befehl, JMP XXX ein 3-Byte Befehl.Im Datenblatt ist die richtige Struktur angegeben. mfg Hartmut
Hallo! Ich habe früher auch ein bischen Assembler programmiert und hätte folgende Vorschläge (die nich unbedingt stimmen müssen - kannst probieren): 1.) schreib in den nicht erwendeten ISRs nicht direkt reti! mach zum beispiel ein "unterprogramm" das unused_isr oder so heißt, schreib dort ein reti rein und gib das bei den nicht verwendeten interrupts an! 2.) deine interrupttabelle ist falsch! schau dir im datenblatt die interruptvektortabelle GENAU an! unter program adress steht, das reset auf 000 liegt, der nächste auf 002, der nächste auf 004! bei dir liegen die interruptroutinen auf 000,001,002,003.... also mach entweder in der tabelle überall ein nop dazwischen oder schreib vor jeden ISRaufruf jeweils 0x002 oder 0x004 hin - damit die auf der richtigen adresse liegen! kannst aber beruhigt sein, den fehler machen viele beim mega16!! also besser die interruptvektortabelle aus und es sollte gehn! mfg andi
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.