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.