Hallo Zusammen, wollte mal für den Stk500 ein miniprogramm in C schreiben, dass bei dem Tastendruck ein zufälliges Bitmuster auf den Leds ausgibt. Das Problem nun das ich habe ist, dass ich mit der Bedingung der while schleife nicht klarkomme. Arbeite mit eine Variablen, und bei jedem durchlauf der schleife wird der wert erhöht. Was aber nicht funktioniert ist die schleife. Die soll das zufällige bitmuster ausgeben, wenn ich eine Taste drücke. Mit while (PIND==0x01) geht das nicht. Mit Pind==0b11111110 geht das.hängt das mit diesem aktiv low zusammen? Bei den leds ist das ja so, dass durch eine 1 die Dinger ausgeschaltet sind und durch 0 ein. Wie ist es bei den tasten und wie stelle ich es an, dass erst beim loslassen der taste das muster angezeigt wird. In maschinensprache habe ich es mit 0x01 hinbekommen, was die schleife anging. Deswegen kapier ich nicht, weshalb es in c anders ist also 1 und 0 vertauscht
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial http://www.amazon.de/C-Programmieren-von-Anfang-computer/dp/3499600749/ref=sr_1_1/277-5077592-3372108?ie=UTF8&s=books&qid=1272146067&sr=8-1
Hallo, danke, aber mir ging es um eine Widerspruch. Hier mal der Code in Assembler und in C. ----------------------------- .include "m32def.inc" ldi r16, 0xff out DDRB, r16 ldi r16, 0x00 out DDRD, r16 ldi r17, 0x00 // Zählvariable mit Startwert loop: inc r17 in r18, PIND andi r18, 0x01 breq loop rjmp setze setze: out PORTB, r17 in r18, PIND andi r18, 0xff brne setze rjmp loop ----------------------------- UNd in C #include <avr/io.h> #include <inttypes.h> volatile uint8_t count; // 8Bit Variable festlegen int main() { DDRB=0xff; //Port B zu Ausgang PORTB=0x01; //Port B high wegen LED´s active low DDRD=0x00; //Port D zu Eingang count=0; while(1) { while(PIND!=0xff) { } while(PIND==0xff) { count++; // zählen } PORTB=count; //ausgabe } ; return 0; } Mir gehts nu darum, dass in C die Bedingung, falls die letzte Taste gedrückt wird lautet PIND!=0xff bzw. PIND==0xff und in Assembler das ganze lautet andi r18, 0x01, das verstehe ich deshalb nicht ganz. 0xff und 0x01 ist ja nicht dasselbe ...
Also habs jetzt selber hinbekommen, eventuell Assembler Code überarbeiten. eine kurze infofrage noch zu dem Code hier: /* Mikroprozessor-Labor 1 Aufgabe 2: Zufallsgenerator in "C" */ #include <avr/io.h> volatile uint8_t count; //globale Variable int main (void) { DDRB = 0xff ; //DDRB als Ausgang definieren DDRD = 0x00 ; //DDRD als Eingang definieren PORTB = 0b00000001; // Alle Pins leuchten, bis auf das Erste (PB0) PORTD = 0xff; //Pullups einschalten ??? count = 0; // Zählvariable auf Null while (1) { while (PIND!=0b11111110){ // Tastendruck ist low (also bei Null) // warte auf Tastendruck } while (PIND==0b11111110){ // Tastendruck ist low (also bei Null) count++; } PORTB = count; } return 0; } Muss ich da diese Pullups einschalten mit PORTD=0xff? Falls ja, warum funktioniert auch ohne.
MIke schrieb: > Muss ich da diese Pullups einschalten mit PORTD=0xff? Falls ja, warum > funktioniert auch ohne. Die Antwort findest Du, indem Du Dir die Beschaltung des Ports anschaust. Laut der AVR-Studio-Hilfe, Abschnitt über STK500, Abschnitt "LEDs and Switches"->"Switches" tastet der Schalter gegen 0, ein externer Pullup ist bestückt. Somit werden die internen nicht gebraucht, tun aber auch nicht weh. Tipp: Du könntest Dir Bitmanipulationen zu Gemüte führen. Um den Zustand eines einzelnen Bits abzufragen, ANDet man mit der Wertigkeit des Bits und fragt dann auf != 0 (einzelner Schalte nicht gedrückt) oder == 0 (gedrückt) ab. Das machst Du manchmal, manchmal aber testest Du alle Schalter gleichzeitig (und somit funktioniert Dein Programm nur, wenn die anderen auch wirklich alle in Ruheposition sind). In Assembler gibt es übrgigens sbis und sbic, die sehr handlich zum Testen eines einzelnen Portbits sind.
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.