Hallo, ich bin noch Anfänger in Sachen Mikrocontroller. Versuche aber gerade eine Migration vom ATmega16 zum ATmega644(20 PU) mit 16MHz zu machen. Dabei bin ich mir aber nicht sicher ob ich alles richtig gemacht habe. Ich würde mich sehr freuen, wenn mir hierzu jemand helfen kann. Das gesamte migrierte Projekt wird zumindest ohne Fehler und Warnungen kompiliert. Kann ich davon ausgehen das somit alles stimmt? In den Anhang habe ich die abgespeckten Quellen vom Original-Projekt und die meiner Migration gestellt. Vielen Dank! mfg pal
1 | #define USART_RXC_vect TIMER2_OVF_vect
|
2 | #define USART_TXC_vect TIMER1_COMPA_vect
|
3 | #define UDR UDR0
|
4 | #define UDRE UDRE0
|
5 | #define UCSRA UCSR0A
|
6 | #define UCSRB UCSR0B
|
7 | #define UCSRC UCSR0C
|
8 | #define UBRRH UBRR0H
|
9 | #define UBRRL UBRR0L
|
10 | #define TXEN TXEN0
|
11 | #define UCSZ1 UCSZ01
|
12 | #define UCSZ0 UCSZ00
|
13 | |
14 | ...
|
15 | |
16 | ISR(USART_RXC_vect) |
17 | |
18 | ...
|
Da braucht man nicht lange nachsehen, um zu wissen das das nicht stimmt. Der Receive Interrupt heisst auch beim Mega644 ganz sicher nicht TIMER2_OFV_vect (Das ist der Overflow Interrupt vom Timer 2) Vergiss die Migration. Schreib ein Programm für den Mega644. Du brauchst einfach immer nur im Hintrekopf halten, dass der 644 offenbar 2 UARTS hat. Also muss in allem was mit dem UART zu tun hat entweder eine 0 oder eine 1 vorkommen, je nachdem welche der beiden UARTS gemeint ist. Also wird die ISR für den Receive Interrupt irgendwas in der Richtung ISR( USART0_RXC_vect) heissen. Also prinzipiell wie die aus deiner Vorgabe vom Mega16, nur irgendwo steckt im Namen eine 0 drinnen, für die USART0. Einfach mal ein wenig logisch nachdenken und weniger mechanisch arbeiten.
Hallo, danke für deine Antwort! Ich habe mich (versucht) an die Migrationsdoku von Atmel zu halten. Aber dann wohl ohne großen Erfolg. Werde mich einfach noch mal, wie du schon sagst, logisch daran geben. Danke!!!!
Karl Heinz Buchegger schrieb: > Du brauchst einfach immer nur im Hintrekopf halten, dass der 644 > offenbar 2 UARTS hat. Der 644 selbst hat nur eine, allerdings haben der 644P und 644A zwei. Schräg, ich weiß. (Der 644 ohne P war der erste der Familie, danach hat man 324P/164P entworfen und diesen eine zweite USART spendiert, die der 644P dann auch mit bekommen hat.)
Danke Jörg für die Erklärung! Da ich den ATmega644(20 PU) nutze muss ich doch als MCU-Type den "ATmega644P" wählen, oder?
Hi >Da ich den ATmega644(20 PU) nutze muss ich doch als MCU-Type den >"ATmega644P" wählen, oder? Nein. PU Steht für das Gehäuse ->PDIP. MfG Spess
Hab mich schon gefragt für was dies steht. Was bedeutet denn die 20?
pal ... schrieb: > Hab mich schon gefragt für was dies steht. Was bedeutet denn die 20? Hast Du kein Datenblatt?
Hi
>Doch.... nur leider weiß ich nicht was mir die 20 sagen soll.
Steht im Datenblatt unter 'Ordering Infomation' oder so ähnlich.
MfG Spess
So... habe mal versucht logisch an die Sache heran zu gehen. Aber gerade bei dem Beispiel mit "USART0_RXC_vect" meldet der Compiler mir eine Warning "'USART0_RXC_vect' appears to be a misspelled signal handler" Versteh momentan nicht was falsch sein soll. Includiert sind die Files "#include <avr/io.h>" und "#include <avr/interrupt.h>" @Spess: Danke für die Info. Hab mir die Seite im Datenblatt noch mal angesehen.
Hab es gerade gefunden.... So "USART0_RX_vect" sollte es richtig sein
Im Anhang ist noch mal die überarbeitete Migration. Hab ich alles richtig gemacht?
Hi >Hat jemand noch eine Idee zur Migration? >ISR(USART0_RX_vect) Der Interrupt für RX wird in der USART-Init nicht freigegen. MfG Spess
Das passiert aber doch in der init().
1 | void init() |
2 | {
|
3 | ....
|
4 | sei(); |
5 | }
|
Oder habe ich dich falsch verstanden?
pal ... schrieb: > Das passiert aber doch in der init().void init() > { > .... > sei(); > } Nein. pal ... schrieb: > Oder habe ich dich falsch verstanden? Was kann man an dem spess53 post falsch verstehen? Was macht den sei(); ?
Ich frag mich ja, was diese 'Migration' eigentlich bringen soll. Das Programm macht auf dem Mega16 nichts sinnvolles und das Migrierte macht auch nichts sinnvolles. @TO Tu dir selbst einen Gefallen und vergiss diesen ganzen Migrier-Schmarrn. Schreib dein Programm auf dem 644, so wie man eben ein Programm entwickelt. Für die paar Dinge, die bisher benutzt werden (Timer, USART) siehst du ins Datenblatt und holst dir von dort die korrekten Bit- und Registerwerte. Und ansonsten schreibst du das alles so, wie man eben ein Programm entwickelt. Um ein richtiges Programm zu migrieren, muss man nämlich schon wissen, was man tut. Da muss man BEIDE Prozessoren kennen, bzw. die Datenblätter dafür vor sich liegen haben. Du kennst offenbar nicht nicht mal einen.
Sorry,.... "sei()" aktiviert Interrupts. Aber wie gebe ich den Interrupt für RX frei? Ich bin Anfänger... So?
1 | UCSR0B |= (1 << TXEN0) | (1 << RXCIE); |
Warum Migrier-Schmarrn? Ich dachte immer, dass man den Mega16 einfach auf den Mega644 umsetzen kann. Was stimmt denn nicht? > Das Programm macht auf dem Mega16 nichts sinnvolles und das Migrierte > macht auch nichts sinnvolles. Doch... ich hatte eigentlich oben bemerkt, dass dieses Programm auf das Minimum heruntergebrochen ist. Es macht keinen Sinn etliche Zeilen Quellcode online zu stellen, die uninteressant sind.
> sei();
Gibt GLOBAL die Interupts frei, jeder einzelne Interupt hat jedoch
zusätzlich sein eigenes Inetrupt enable Bit im IO-Register
Adressbereich.
pal ... schrieb: > Warum Migrier-Schmarrn? Weil du fehlendes WIssen dadurch kompensierst, dass du irgendwo Code klaust ohne zu wissen was du tust. Das funktioniert nicht. Fehlendes Wissen wird durch 'lernen' wett gemacht und nicht durch Code klauen. Die einzig richtige Antwort auf Spess Einwand wäre gewesen: Der 644-er COde verwendet den UART Interrupt (noch) nicht, genauso wie er auch im 16-er Original still gelegt ist. Das wäre die Antwort gewesen. Und die Tatsache das sie nicht gekommen ist, erzählt mir Bände.
Hi >Aber wie gebe ich den Interrupt für RX frei? Ich bin Anfänger... >So? >UCSR0B |= (1 << TXEN0) | (1 << RXCIE); Ja. Aber jetzt hast du den Empfänger nicht eingeschaltet. Lies mal im Datenblatt nach, was die Bits TXEN, RXEN, TXCIE und RXCIE bewirken. MfG Spess
@Karl Heinz: > Weil du fehlendes WIssen dadurch kompensierst, dass du irgendwo Code > klaust ohne zu wissen was du tust. Stimmt nicht ganz! Ich habe den Code nicht geklaut. Und ja, die UART Interrupt werden auch im Mega16 nicht durchlaufen. @Spess: Danke, ich schau mir die Sachen trotzdem noch mal im Datenblatt an.
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.