mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IR_Code


Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:
  • ir.txt (1,97 KB, 93 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktioniert nicht...


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

Autor: holger (Gast)
Datum:

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

Meinen ersten Post lesen und Fehler korrigieren.

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
komme aber leider nicht mit was du genau meinst

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
nochmals probiert geht nicht

????

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also gut hier die Lösung:

switch(~PINC)

Könnte klappen. ;)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder wolltest du PINC nicht invertieren ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.