Forum: Mikrocontroller und Digitale Elektronik IR_Code


von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

>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

von Mathias K. (underworldgamer)


Lesenswert?

funktioniert nicht...


../serial.c:87: error: case label does not reduce to an integer constant

von holger (Gast)


Lesenswert?

>../serial.c:87: error: case label does not reduce to an integer constant

Meinen ersten Post lesen und Fehler korrigieren.

von Mathias K. (underworldgamer)


Lesenswert?

komme aber leider nicht mit was du genau meinst

von holger (Gast)


Lesenswert?

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 ;)

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

nochmals probiert geht nicht

????

von Mathias K. (underworldgamer)


Lesenswert?

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

von holger (Gast)


Lesenswert?

Also gut hier die Lösung:

switch(~PINC)

Könnte klappen. ;)

von holger (Gast)


Lesenswert?

Oder wolltest du PINC nicht invertieren ?

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
Noch kein Account? Hier anmelden.