Hallo Habe eine Code der regelmäßig mit Polling die Pins abfrägt realisiert mit if Schleifen ist dies auch mit der Switch() Funktion möglich -------------------------------------------- #include <avr/io.h> #include <inttypes.h> #ifndef F_CPU #define F_CPU 1000000UL /* Quarz mit 1 Mhz */ #endif //#include <avr/delay.h> /* definiert _delay_ms() ab avr-libc Version 1.2.0 */ #include <util/delay.h> /* in der aktuellen Version in util/ */ void uart_init() { // UART Transmitter ein // Data mode 8N1, asynchron 4800 1MHZ UBRRH = 0; // Highbyte ist 0 UBRRL = 207; // Lowbyte ist 12 ( dezimal ) UCSRB = (1 << TXEN)|( 1 << RXEN ); // UART TX RX einschalten UCSRC =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); } void uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) //warten bis senden möglich ist { } UDR = c; //Ausgabe des Zeichens über UDR } unsigned char uart_receiver(void) { while (!(UCSRA & (1<<RXC))); /* Wait for incomming data */ return UDR; } void uart_puts (char *s) { //schleife wird so lange ausgeführt bis kein Zeichen mehr kommt while (*s) { uart_putc(*s); s++; } } int main(void) { DDRC = 0x00; DDRB = 0x00; unsigned char statusbyte = 0x00; uart_init(); int i=0; // int n=0; // int s=0; //int x; for(;;) { //x++; switch(!PINC) { case PINC = 0x01: statusbyte = 0x02; break; case 0x02: statusbyte = 0x02; break; case 0x04: statusbyte = 0x03; break; case 0x08: statusbyte = 0x04; break; default: break; } switch(PINB) { case 0x01: statusbyte = 0x07; break; case 0x02: statusbyte = 0x06; break; case 0x04: statusbyte = 0x05; break; default: break; } if(statusbyte != 0x00) { for(i=0;i<=5;i++) { uart_putc(statusbyte); } } statusbyte = 0x00; _delay_ms(1); } } .................................. mfg Mathias
>Habe eine Code der regelmäßig mit Polling die Pins abfrägt realisiert >mit if Schleifen ist dies auch mit der Switch() Funktion möglich Klar geht das, schon mal ausprobiert ? > switch(!PINC) Falsch > case PINC = 0x01: statusbyte = 0x02; Falsch
funktioniert nicht... ../serial.c:87: error: case label does not reduce to an integer constant
>../serial.c:87: error: case label does not reduce to an integer constant
Meinen ersten Post lesen und Fehler korrigieren.
Die beiden Zeilen mit Fehler hab ich doch eingefügt. Denk drüber nach. Wenn du bis morgen noch nicht drauf gekommen bist löse ich das Rätsel. Ich muss jetzt leider schlafen gehen ;)
Ich möchte gerne einfach eine Switch Funktion die so geht: switch(!PINC) { case 0: statusbyte = 0x02; //macht das,wenn PC0 break; case 1: statusbyte = 0x02; //macht das,wenn PC1 break; case 2: statusbyte = 0x03; //macht das,wenn PC2 break; case 3: statusbyte = 0x04; //macht das,wenn PC3 break; case 4: statusbyte = 0x04; //macht das,wenn PC4 break; case 5: statusbyte = 0x04; break; case 6: statusbyte = 0x04; break; default: break; } Hab alles was oben angeführt ist ausprobiert. mfg Mathias
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.