hi, aufgrund meiner Arbeit muss ich mich seit letzter Woche mit mikrocontroller programmieren beschäftigen. für den einstieg wollte ich erstmal meine LED auf dem controller per "internen" eingang ein und ausschalten. habe dazu das tutorial gelesen aber meine Led reagiert nicht auf den Eingang?! die LED in der schleife alleine funktioniert soweit mein code: int main(void) { while(1) { DDRC &= ~(1<<DDC7); /* Pin PC7 als Eingang */ PORTC |= (1<<PC7); //PINC &= (1<<PIN7); if ( PIN7 == 1) { DDRB = (1<<DDB7); PORTB = PORTB & ~(1<<PB7); //Led setzen //PORTB |= (1<<PB7); //LED löschen } } return 0; } vllt könnt ihr mir sagen wo da der Fehler liegt?! thx für antworten ;)
Läßt sich der Code überhaupt kompilieren? PIN7 ist allenfalls eine define aber keine Variable. Wenn ja, muß sich hier auf einen Port festgelegt werden z. B. PINA und dann gibt es ein 8-Bit breites Datenbyte zurück. Also Du kannst vielleicht if(PINC & PIN7) { ... schreiben. alternativ: uint8 Variable = 0; .... main { DDRC = 0x7F; (ist das gleiche wie ~(1<<PIN7) while(1) { Variable = PINC; if (Variable & 0x80) // alternativ (1<<PIN7) { PORTB = 0x01; oder was auch immer Vielleicht wäre es hilfreich erst einmal die grundsätzlichen C-Kenntnisse für die Mikrokontroler zu erlernen. Dann wird vielleicht auch mal Spaß beim Programmieren auftreten. Übrigens ist es nicht sinnvoll das Data Direction Register DDRC in der Schleife ständig zu beschreiben. So etwas nennt man Initialisierung und wird i. d. R. vor dem Eintritt in die while-schleife gemacht.
Du hast mehrere "Fehler". Die Initialisierung (Festlegung ob Ein/Ausgang, Pullupwiderstände, usw.) macht man normalerweise Außerhalb der Endlosschleife. Braucht man ja nur 1 Mal definieren, es sei denn Du möchtest einen Pin mal als Eingang und später als Ausgang definieren. Des weiteren ist das hier falsch:
1 | if ( PIN7 == 1) |
2 | {
|
3 | ...
|
4 | }
|
PIN7 ist ein Makro. Also irgendwo über #define PIN7 7 definiert. Im Prinzip steht da nur:
1 | if (7 == 1) |
2 | {
|
3 | ...
|
4 | }
|
Und das ist immer falsch! Schau mal nochmal das Tutorial an. Du tust auch nirgends Deinen Pin wieder Rücksetzen wenn der Taster nicht mehr gedrückt ist. Somit wird er nur 1 Mal gesetzt und bleibt dann an. Probier mal dass hier:
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | DDRC &= ~(1<<DDRC7);//Ist Standardmäßig schon ein Eingang, aber ok |
6 | PORTC |= (1<<PC7); //Pullup an Taster an |
7 | |
8 | DDRB |= (1<<DDRB7); //PB7 als Ausgang definieren, da LED |
9 | |
10 | while(1) |
11 | {
|
12 | if ( !(PINC & (1<<PINC7)) )//Taster betätigt (Low aktiv durch Pullup) |
13 | {
|
14 | PORTB |= (1<<PB7); //High Pegel an PB7 |
15 | }
|
16 | |
17 | else //Taster nicht betätigt |
18 | {
|
19 | PORTB &= ~(1<<PB7); //Low Pegel an PB7 |
20 | }
|
21 | }
|
22 | |
23 | return 0; |
24 | }
|
Müsste softwaremäßig so passen. Bist Du Dir auch sicher wie Du die Hardware angeschlossen hast? Also Taster an Pin C7 und GND. LED über Vorwiderstand an Vcc oder GND (je nach dem was für eine Logik Du realisiert haben möchtest). Bei Atmels ist es glaub ich nicht so relevant, da sie intern Highsideswitches und Lowsideswitches haben. Früher bei den 8051 war nur ein Lowsideswitch drinnen und so hat man die LED über den Vorwiderstand an Vcc (z.B. +5V) angeschlossen. Grüße Grüße
danke für die antworten, ne ich hab noch kein taster angeschlossen, ich wollte die Eingänge einfach erstmal "intern" per software ansteuern!?
Marcel Bernstedter schrieb: > ne ich hab noch kein taster angeschlossen, ich wollte die Eingänge > einfach erstmal "intern" per software ansteuern!? Mit nem Debugger kannst Du zur Laufzeit die Register für den Taster setzen, anonsten macht das wenig Sinn...
so ich habe das jetzt mal mit äußeren Taster gebaut. mein code sieht jetzt so aus: int main(void) { DDRB = (1<<DDB7); DDRA &= ~(1<<DDA2); PORTA |= (1<<PA2); while(1) { if ( PINA & (1<<PINA2) ) { PORTB &= ~(1<<PB7); //Led setzen //PORTB |= (1<<PB7); //LED löschen } else { PORTB |= (1<<PB7); } } return 0; } Problem: beim ein und ausschalten an PINA2 (oder PIN2) geht die LED immer noch nicht an oder aus ;)
Mach mal nochmal eine Klammer drum:
1 | if ( (PINA & (1<<PINA2)) ) |
2 | {
|
3 | ...
|
4 | }
|
hi, so ne ok klappt alles, hab nur was mit VCC und GND vertauscht!
Marcel Bernstedter schrieb: > so ne ok klappt alles, hab nur was mit VCC und GND vertauscht! Jou...da würde ich aufpassen, ansonsten geht er vielleicht bald gar nicht mehr ;-)
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.