Hallo, ich wollte mal ein einfaches Testprogramm schreiben. anscheinend ist das aber nicht so einfach. #include <avr/io.h> int main (void) { unsigned char temp; unsigned char temp2; DDRB = 0xff; // Alle bits an Port B sind ausgänge PORTB = 0xff; // Alle Bits aktiv high (1) DDRA = 0x00; PORTA = 0xff; temp=PINA; temp2=0; PINB=0x01; // Dieser Befehl hat z.b. keine auswirkung while(1) { if(PINA!=temp) { temp=PINA; temp2++; if(temp2%2==0) { PINB=0xff; //hat auch keine auswirkung } else PINB=0x00; //hat auch keine auswirkung } } /* wird nie erreicht */ return 0; } wieso wird an port B nix ausgegeben? Außerdem kann ich das Programm auch nur im Einzelschrittverfahren(F11 drücken) betreiben. wenn ich in avr studio auf RUN drücke passieren seltsame sachen... und er verhält sich nicht wie bei den einzelnen Schritten. MfG P. Rieger
die I/Os werden über die PORTx Register gesetzt und über die PINx Register gelesen. Ob schreiben von PINx etwas ändert, hängt von deinem Controller ab (der hier aber nicht erwähnt wird)
Patrick Rieger schrieb: > wenn ich in avr studio auf RUN drücke passieren seltsame sachen... und Was sind denn 'seltsame sachen' ?
also ich in dem stk500 steck ein atmega 8515L da es den bei avr studio aber nicht gibt habe ich den ohne L genommen. achso. ich dachte eigentlich das über PORTx nur die pullups eingeschaltet werden ... komische sachen sind: wenn ich an auf den eingang von porta ein signal gebe, hat das keine auswirkung... wenn ich dann den port b beobachte und dann wieder zurück auf port a gehe, ist meine eingabe auch wieder verschwunden... außerdem dauert es extrem lang bis er das kästchen überhaupt als ausgefüllt anzeigt...
nochma zu den komischen sachen ... #include <avr/io.h> int main (void) { unsigned char temp; unsigned char temp2; DDRB = 0xff; // Alle bits an Port B sind ausgänge PORTB = 0x00; // Alle Bits aktiv high (1) DDRA = 0x00; // Alle bits an Port B sind eingäne PORTA = 0x00; temp=PINA; temp2=0; PORTB=0x01; // !!*a*!! while(1) { if(PINA!=temp) { temp=PINA; temp2++; if(temp2%2==0) { PORTB=0xff; } else PORTB=0x00; } } /* wird nie erreicht */ return 0; } also im einzelbetrieb funktionier das ... am anfang hat der port b den wert 0x01 ... bei jeder änderung an porta wechselt der port b zwischen 0x00 und 0xff wenn ich RUN drücke tut sicht nichts ... an port b ist dauerhaft 0x00 dabei sollte er doch wenigstens den wert 0x01 (wegen !!*a*!!) anzeigen ohne das ich an port a was geändert habe...
Patrick Rieger schrieb: > also ich in dem stk500 steck ein atmega 8515L da es den bei avr studio > aber nicht gibt habe ich den ohne L genommen. > > achso. ich dachte eigentlich das über PORTx nur die pullups > eingeschaltet werden ... Dann solltest du nochmal die Tutorien studieren. AVR-GCC-Tutorial AVR-Tutorial Auch wenn letzteres ein Assembler Tutorial ist, so findet sich doch in den generellen Beschreibungen (in dem Fall I/O) so manches, was auch für einen C-Programmierer interessant ist. > komische sachen sind: > > wenn ich an auf den eingang von porta ein signal gebe, hat das keine > auswirkung... wenn ich dann den port b beobachte und dann wieder zurück > auf port a gehe, ist meine eingabe auch wieder verschwunden... > > > außerdem dauert es extrem lang bis er das kästchen überhaupt als > ausgefüllt anzeigt... Redest du vom Simulator oder vom realen Chip?
Ich kann mir absolut nicht erklären wieso das nicht geht. weils mit einzelnen schritten funktioniert! wenn da nen fehler drin wär dann müsste das doch weder mit einzelnen schritten noch mit RUN laufen .... nochma n noch einfacheres beispiel das auch nur mit einzelschritten geht... #include <avr/io.h> int main (void) { unsigned char temp; PORTB = 0x00; // Alle Bits sind inaktiv DDRB = 0xff; // Alle bits an Port B sind ausgänge PORTA = 0xff; // interne pullups an DDRA = 0x00; // Alle bits an Port A sind eingäne temp=PINA; //startwert von Pin a speichern PORTB=0x01; //startwert an PORTB ausgeben ( GEHT NICHT ) while(1) { if(PINA!=temp) //wenn sich was geändert hat { temp=PINA; //neuen zustand speichern PORTB=PINA; // Zustand von Pin a an Port B ( GEHT NICHT ) } } /* wird nie erreicht */ return 0; }
Patrick Rieger schrieb: > wenn da nen fehler drin wär dann müsste das doch weder mit einzelnen > schritten noch mit RUN laufen .... Wenn du den Simulator mit RUN laufen lässt, dann vernachlässigt der seine GUI. Sprich die GUI Updates erfolgen nur noch ab und an. Reib dich doch nicht am Simualtor auf. Den benutzt man sowieso nicht um sein Programm einfach frei darin laufen zu lassen, und dann auf die Port-Kästchen zu klicken. Entscheidend ist deine reale Hardware. Mit dem Simulator klärt man nur einzelne Dinge ab, für die man dann in Einzelschrittweise die betreffenden Codestellen durchgeht. Und den (uninteressanten) Rest lässt man vom Simulator im schnellen Vorlauf zwar durchackern, aber es ist völlig wurscht ob der seine GUI sofort updatet oder abfragt. Beim nächsten Breakpoint ist früh genug.
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.