Hallo habe einen Atmega8 mit 8MHZ. Drei Pins (PB1 bis PB3) sollen als digitale Eingänge dienen, diese Pins sollen je Programmdurchlauf mittels einer Funktion geprüft werden, ob sie high (+5v) oder low sind. Der Funktionswert steuert später ein paar Ausgänge, PWM usw. Ist Pin PB1 high soll der Wert der Funktion PosLK = 1 sein, ist PB2 high soll PosLK() = 2 sein usw. Der Wert von PosLK wird dann mit UART an HTerm gesendet, das funktinoiert, aber der Rest will nicht so wirklich. Benutzte AVR Studio 4, mit AVR Dude. Hier der Code (paar Header zuviel, die sind für spätere Aufgaben) ******************************************************************** #include <avr/io.h> #include <avr/interrupt.h> #define _AVR_ATmega8_ 1 //Festlegung des µC Types #define OSCSPEED 8000000 // CPU Speed mit 8 MHZ #define F_CPU 8000000UL // CPU Festlegung für delay Header #include <util/delay.h> //Einbindung von Warteschleifen #include <stdint.h> #include <stdlib.h> void InitUART(uint32_t baud) //die Funktion geht { int baudrate=(OSCSPEED/(16*baud))-1; UBRRH = (unsigned char)(baudrate>>8); UBRRL = (unsigned char)baudrate; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (1<<URSEL)|(3<<UCSZ0); } void UARTTransmit(unsigned char data) //die Funktion auch { while (!( UCSRA & (1<<UDRE)) ); UDR = data; } //Hier geht der Ärger los: unsigned char PosLK(void) { unsigned char Ort; if (bit_is_set(PINB,1)) //PIN B1 als Eingang { Ort = 1; } if (bit_is_set(PINB,2)) //PINB2 als Eingang { Ort = 2; } if (bit_is_set(PINB,3)) //PINB3 als Eingang { Ort = 3; }else{ Ort = 0;} return Ort; } int main()//******************************************************** { InitUART(9600); DDRB &= ~(1<<PB1); // Pin PB1 als eingang PORTB |= (1<<PB1); // PIN PB1 High Reading Eingang DDRD &= ~(1<<PB2); // Pin PB2 als eingang PORTD |= (1<<PB2); // PIN PB2 High Reading Eingang DDRD &= ~(1<<PB3); // Pin PB3 als eingang PORTD |= (1<<PB3); // PIN PB3 High Reading Eingang while(1)//******************************************************** { _delay_ms(1000); UARTTransmit(PosLK()); //****************************************************************** } return 0;} Bin für jede Hilfe dankbar, Gruß Max
Max schrieb: > Bin für jede Hilfe dankbar, Ok, dann: - ein lesbarer und formatierter Quelltext würde die Freude am Verstehen erhöhen - wo ist das Problem? Etwas geht und etwas nicht, aber was genau willst du nicht verraten? - Was soll deine PosLK() liefern, wenn mehrere Bits gesetzt sind=
Ersetze in der PosLK-Funktion 2x if durch else if. Zur Zeit hängt der Ruckgabewert ausschließlich davon ab, ob PINB3 gesetzt ist.
also ja klar das problem ist, dass meine PosLK() Funktion immer den gleichen Rückgabewert liefert. Im Moment ist der Rückgabewert immer = 1. Zum Prüfen ob die Funktion läuft hänge ich +5V direkt an den einzelnen Pin. habe die Funktion jetzt so geändert: unsigned char PosLK(void) { unsigned char Ort; if (bit_is_set(PINB,1)) //Wenn Pin PB1 hight ist, soll Ort = 1 { Ort = 1; } else if (bit_is_set(PINB,2)) //PINB1 als LSM { Ort = 2; } else if (bit_is_set(PINB,3)) //PINB2 { Ort = 3; }else{ Ort = 0;} return Ort; } macht die Sache aber auch nicht besser -.- Das gesendete Ergebniss mit UARTTransmit(PosLK() | 0x30); bzw. mit UARTTransmit(PosLK()); ist immer 1.
Du hast die Pullups aktiviert! D.h. die Pins liefern, wenn nichts drann hängt eine 1. Das heißt aber auch, dein pin_is_set liefert immer TRUE. Du musst die Pins mit Masse verbinden, nicht mit Vcc! Und du musst das in deiner Auswahllogik auch berücksichtigen.
jup stimmt, habe den Wald vor lauter Pins nicht mehr gesehen. Normalerweise hängt ein Sensor an den Eingangspins welcher "komplett beschaltet ist", da klappt das mit den +5Volt. Einfach vcc auf den Pin geben klappt natürlich nicht - war wohl zu faul das ganze sensorzeug wieder zusammen zu stecken und an die Pins zu geben.
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.