Hallo Ich beschäftige mich erst seit neuestem mit uCs. Ich bin noch bei dem simplen gebastel mit Dioden an einem ATMega. Jetzt möchte ich mit einem stückchen Draht das an GND hängt einen Schlater simulieren. Aber folgendes Programm funktioniert nicht und ich begreife nicht so ganz warum: void main(void) { DDRC=0xff; //PORTC ist Ausgang DDRF=0x00; //PORTF ist Eingang PORTF=0xff; //pullups aktivieren für Eingang => 5V an den PINS, zum Schalten auf Masse ziehen! while(1) { loop_until_bit_is_set(PINF, PINF7); //warte bis Taste zum Senden gedrückt oder Interrupt eingelaufen setbit(PINC,PC5); loop_until_bit_is_clear(PINF, PINF7); clearbit(PINC,PC5); } } Dadurch das ich die internen Pullups aktiviert habe müsste ja die Abfrage von einem PINF "1" ergeben. Wenn ich jetzt einen Draht von Masse an den PIN lege müsste die Abfrage "0" ergeben. Aber das funktioniert nicht. Die Abfrage ergibt immer "0". Wo ist mein Denkfehler? Der interne Pullup bringt doch den PIN auf 5V oder nicht?
@ Bastler Welche Proogrammiersprache und Compiler ist das? Sieht nach C aus, aber wohl kein GCC. >Dadurch das ich die internen Pullups aktiviert habe müsste ja die >Abfrage von einem PINF "1" ergeben. Wenn ich jetzt einen Draht von Masse >an den PIN lege müsste die Abfrage "0" ergeben. Ja. >Der interne Pullup bringt doch den PIN auf 5V oder nicht? Ja. Das Problem ist möglicherweise Prellen. Mach mal einen Delay von 1 Sekunde hinter die Anweisung, welche die LED anschaltet. MFG Falk
Welchen Mega benutzt du?
> setbit(PINC,PC5);
Du willst nicht am PIN Register eine 1 setzen,
sondern am PORT register
setbit(PORTC, PC5);
PIN von der Umwelt -> µC
PORT vom µC -> Umwelt
Mach mal folgendes, noch einfachere Programm
[C]
int main()
{
DDRC=0xff; //PORTC ist Ausgang
DDRF=0x00; //PORTF ist Eingang
PORTF=0xff; //pullups aktivieren für Eingang => 5V an den PINS, zum
Schalten auf Masse ziehen!
while(1)
{
PORTC = PINF;
}
}
Hallo Ist ein ATMega128. Benutze AVRStudio mit istalliertem WinAVR. An PORTC hängen über Vorwiderstände Dioden zu Masse. An PORTF halte ich wiegesagt einen Draht der an Masse angeschlossen ist... Das Programm von kbucj´hegg funktioniert leider auch nicht. Hab irgendwie das Gefühl da ist ein ganz simpler fataler Denkfehler drin. Komme aber im Moment nicht drauf.
Hier nochmal der komplette Quelltext: //Includes #include <avr/io.h> //Header mit I/O Registern aus WinAVR #include <avr/interrupt.h> //Interrupts #include <inttypes.h> //Inttypes der Atmels //Defines #define setbit(ADRESSE,BIT) (ADRESSE |= (1<<BIT)) //vereinfachter Zugrriff auf ein Bit #define clearbit(ADRESSE,BIT) (ADRESSE &= ~(1<<BIT))//vereinfachter Zugrriff auf ein Bit #define checkbit(ADRESSE,BIT) (ADRESSE & (1<<BIT)) //vereinfachter Zugrriff auf ein Bit /*********************************************************************** ***************************** "delay1ms" Die Funktion verzögert mit einem 8-Bit Timer um 1ms. Es sind Verzögerungen bis 65sec möglich => delay(65535) ************************************************************************ ****************************/ void delay1ms(uint16_t ms) { TCCR0A = 0x00; //Timer initialisieren (s.S. 110) setbit(TCCR0A, CS00); //Vorteiler: keiner (1) ms *= 62; while (ms) { while(!(checkbit(TIFR0, TOV0))){} //warte solange kein Überlauf (TOV0=0), wenn Überlauf (TOV0=1) wird while verlassen setbit (TIFR0, TOV0); //Flag wird durch setbit wieder gesetzt (Datenblatt) ms--; } } //Ende der Funktion void main(void) { DDRC=0xff; //PORTC ist Ausgang DDRF=0x00; //PORTF ist Eingang PORTF=0xff; //pullups aktivieren für Eingang => 5V an den PINS, zum Schalten auf Masse ziehen! while(1) { PORTC=PINF; } } //Ende main Hab gerade schon überlegt was es an dem C auszusetzten gibt ;-) Klar, wenn man die Defines nicht mit postet.
Bastler wrote: > Hier nochmal der komplette Quelltext: > > > //Includes > #include <avr/io.h> //Header mit I/O Registern aus WinAVR > #include <avr/interrupt.h> //Interrupts > #include <inttypes.h> //Inttypes der Atmels > > //Defines > #define setbit(ADRESSE,BIT) (ADRESSE |= (1<<BIT)) //vereinfachter > Zugrriff auf ein Bit > #define clearbit(ADRESSE,BIT) (ADRESSE &= ~(1<<BIT))//vereinfachter > Zugrriff auf ein Bit > #define checkbit(ADRESSE,BIT) (ADRESSE & (1<<BIT)) //vereinfachter > Zugrriff auf ein Bit > > > > /*********************************************************************** ***************************** > > "delay1ms" > Die Funktion verzögert mit einem 8-Bit Timer um 1ms. > Es sind Verzögerungen bis 65sec möglich => delay(65535) > > ************************************************************************ ****************************/ > > void delay1ms(uint16_t ms) > { > TCCR0A = 0x00; //Timer initialisieren (s.S. 110) > setbit(TCCR0A, CS00); //Vorteiler: keiner (1) > ms *= 62; > while (ms) > { > while(!(checkbit(TIFR0, TOV0))){} //warte solange kein > Überlauf (TOV0=0), wenn Überlauf (TOV0=1) wird while verlassen > setbit (TIFR0, TOV0); //Flag wird durch setbit wieder > gesetzt (Datenblatt) > ms--; > } > } //Ende der Funktion > > > > void main(void) > { > DDRC=0xff; //PORTC ist Ausgang > DDRF=0x00; //PORTF ist Eingang > PORTF=0xff; //pullups aktivieren für Eingang => 5V an den PINS, zum > Schalten auf Masse ziehen! > > while(1) > { > PORTC=PINF; > } > } //Ende main > > > > > > Hab gerade schon überlegt was es an dem C auszusetzten gibt ;-) > Klar, wenn man die Defines nicht mit postet. Ja. Aber daran liegt es nicht mehr. Das einfachst Programm verwendet das gar nicht mehr Hmm. while(1) { PORTC = PINF; } Das ist so einfach wie nur was. Das muesste eigentlich gehen. Wenn du einen Pin am F Port auf Masse ziehst muesste sich am C Port was tun. Hmm Was ist mit void main(void) { DDRC=0xff; //PORTC ist Ausgang DDRF=0x00; //PORTF ist Eingang PORTF=0xff; //pullups aktivieren für Eingang => 5V an den PINS, zum while(1) { PORTC = 0xAA; } } Jetzt müsste am C Port abwechselnd 1 Led brennen und 1 aus sein. (mal schauen, ob dein Prozessor überhaupt arbeitet). Wenn das geht: Probier mal anstelle des F Ports den B Port void main(void) { DDRC = 0xff; //PORTC ist Ausgang DDRB = 0x00; //PORTB ist Eingang PORTB = 0xff; while(1) { PORTC = PINB; } }
wenn das Einfachprogramm nicht funktioniert, dann ist wohl an der Hardware oder am Programmer was faul, oder du misst Mist? Kannst du das Programm wieder auslesen bzw. geht verifiy, hast du an den Fuses geändert?
Mega128 Blöde Frage: Die 103-Kompatibilitätsfuse hast du ausgeschaltet?
Das Programm von Dir läuft. Das Problem ist schlichtweg, dass die PINF Abfrage immer 0 ergibt... Wenn man mit einem Multimeter nachmist kommen aber 4,81V raus, was ist da los? Da muß also irgendwas an der Abfrage falsch sein.
Habs jetzt mal mit PORTE als Eingang versucht. Da funktioniert alles wie ich mir das vorgstellt habe. Alle Ports haben ja auch Sonderfunktionen. Kann es sein das ich PORTF irgendwie nicht mehr als IO Port sondern als Sonderfunktionsport eingestellt habe (wie auch immer das gehen mag)?
Da bin ich überfragt. Ich kenn den Mega128 nicht. Hol dir von Atmel das Dtaenblatt und sieh nach was am PORTF sonst noch so rumliegt. Wo liegt beim 128 eigentlich das JTAG Interface. So er eines hat, muss man auch das abschalten.
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.