Hallo! Nach langem Hin und Her hab ich es endlich geschafft: Ein Assembler Programm das mir eingegebene Zeichen (von PC) zurück schickt und dabei ein Aktivity-LED leuchtet ;)) Umso länger probiere ich aber schon, das ganze in C zu machen, da ich weitere Sachen dann auch in C machen will...beispielsweise wenn ein Zeichen kommt den zuerst in einen Buffer schreiben bis ein "Befehl" fertig ist und dann dementsprechend auf PORTC Pin 5 für eine Sekunde auf Saft schalten. Jedenfalls hab ich im Moment das folgende C Programm: (AT90S2333) #include <io.h> #define CPU_CLOCK 4000000 void init_serial(void); void init_io(void); SIGNAL(SIG_UART_RECV) { outp(inp(UDR), PORTB); //return 0; } int main(void) { init_serial(); init_io(); //sbi(GIMSK, //_sei(); asm volatile("sei"); while(1); return(0); } void init_serial(void) { sbi(UCSRB, RXEN); sbi(UCSRB, RXCIE); outb((CPU_CLOCK/(9600*16L)-1), UBRR); } void init_io(void) { outp(0x80, DDRB); } 1.) Stimmt die Interrupt Handler Routine?? Ist damit alles getan? Wird die Tabelle, die sonst in Assembler mit ".org 0x08" geschrieben werden müsste, automatisch geschrieben?? Der Compiler beklagt sich dass kein return Wert definiert ist, Standard zu "int" und dass dieser keinen Rückgabewert liefert. Was soll ich da machen? (Ich hasse "Warnings"...einfach so? int SIGNAL(SIG_UART_RECV) { // Code return 0; } 2.) Wie man sieht sollte das Programm einfach die LEDs an PORTB blinken lassen wenn was reinkommt...Wäre das so richtig oder muss man ein Delay oder ähnliches einbauen (dass es ja in ASM auch nicht gibt) 3.) Passt es wenn ich zum globalen Aktivieren der Interrupts asm volatile("sei"); nehme? 4.) Muss man nicht extra ein Bit in GIMSK setzen? Findet man nirgens was darüber...wenn ja wie geht das und VOR ALLEM welches Bit ist es (im Datenblatt schon geschaut, es gibt so viele Möglichkeiten) 5.) Ich habe nirgendwo ein funktionierendes C Programm für den UART Empfang über Interrupts für einen AT90S2333 gefunden (der verwendet andere Registernamen, Adressen unsw). Kennt jemand ein einfaches Programm das ca diesen Zweck von oben erfüllt (d.h. zum testen) und das funktioniert? Vielen Dank, Niki
Hallo! 1a.) Wird automatisch geschrieben. 1b.) Der Compiler erkennt nicht, dass das eine Interrupt Routine sein soll und behandelt es als normale Funktion. Include sig-avr.h und interrupt.h, dann geht's. 2.) siehe 1b. 3.) Kannst sei(); nehmen, kommt aber auf's gleiche raus. 4.) Nein, ich denke nicht. 5.) Ja, deines nachdem du es verbessert hast! ;-) Um anderen die Mühe zu ersparen, kannst du es ja in der Codesammlung posten sobald es läuft. MfG Andreas
Danke!!! Jetzt funktionierts, super :-) Ich habe es bereits in die Codesammlung gestellt Niki
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.