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
Gast
#533781
>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
Gast
#533912
>../serial.c:87: error: case label does not reduce to an integer constant
Meinen ersten Post lesen und Fehler korrigieren.
komme aber leider nicht mit was du genau meinst
Gast
#533917
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 ;)
nochmals probiert geht nicht ????
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
Gast
#534363
Also gut hier die Lösung: switch(~PINC) Könnte klappen. ;)
Gast
#534461
Oder wolltest du PINC nicht invertieren ?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.