www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Reaktives Blinklicht mit AT Mega8 und IR-Empfänger


Autor: Torsren W. (deidextra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Mikrocontroller-Gemeinde,

Ich habe im Studium ein kleines bisschen über Mikrocontroller und 
embedded Systems gelernt und wollte nun mein Wissen anwenden:

Ich bin begeisterter Geocacher und wollte nun mit Freunden einen 
Nachtcache legen. Als eine Station wollten wir ein Nachtaktives 
Reaktivlicht setzen. Weil ich schon mal was von Microcontrollern gehört 
hab, hab ich die Aufgabe übernommen und stehe jetzt vor nem kleinen 
Problem.

Mein kleines Reativlicht soll auf eine Fernbedinung reagieren und als 
Ausgabe den neuen Waypoint in Form eines Morsecodes ausgeben.

Die Schaltung habe ich soweit gelötet und sollte auch so funktionieren.
Ich verwende einen ATMega8-16DIP mit TSOP1738 und normalen LEDs als 
ausgabe.
Ich programmiere mit micropascal for AVR Pro.

Mein Programmcode sieht so aus
program geo;


{ Declarations section }



{ Declarations section }


// Hauptprogramm (Main)

  var incoming_IR_yes : boolean   ;

 // Ausgabe auf die LED´s
    procedure Ausgabe  ;
    //var       ;
      begin

         PORTB.B5 := 0x00 ;
         Delay_ms (3000) ;
         PORTB.B3 := 0x00 ;
         

      end;


  //Hauptschleife für Abfrage Infrarot

    procedure Abfrage_infrarot_eingang  ;      // oder alles als function
         var i : integer ;


      begin
      

           PORTC := 0x00 ;     //alles aus auf port c  einga infrarot
           PORTB := 0xff ;     //alles aus auf port b

           PORTB.B5 := 0x00 ;  //rot an
           Delay_ms (1000) ;    //pause
           PORTB.B5 := 0x01 ;   //rot aus
           Delay_ms (1000) ;    //pause
           PORTB.B5 := 0x00 ;   //rot an
           Delay_ms (1000) ;    //pause
           PORTB.B5 := 0x01 ;   //rot aus
           Delay_ms (1000) ;    //pause
           PORTB.B5 := 0x00 ;   //rot an
           Delay_ms (1000) ;    //pause
           PORTB.B5 := 0x01 ;   //rot aus
           
          {while PORTC.B3 <> 0x00 do                                        // unendlich schleife start
                 begin



                      // if PORTC.B3 <> 0x01 then Ausgabe //else
                    {begin     // oder ne braek und er läuft weiter in die nächste function weiß noch nciht genau ob das funst
                      Delay_ms (100) ;                        //mit dem delay müssen wir noch mal spielen bzw rechnen weil einmal in der gesamt signallaufzeit reicht mussen ja nur eine 1 erwischen um auzulösen
                      PORTB.B1 := 0x00 ;
                      Delay_ms (100) ;
                      PORTB.B1 := 0x01 ;
                      Delay_ms (100) ;

                      PORTB.B3 := 0x00 ;
                      Delay_ms (100) ;
                      PORTB.B3 := 0x01 ;
                      Delay_ms (100) ;

                      PORTB.B5 := 0x00 ;
                      Delay_ms (100) ;
                      PORTB.B5 := 0x01 ;
                      end;
                      delay_ms (10)
                 end;}                                    // unendlich schleife ende
                 
                   i := 0 ;
                 while i <> 0 do
                       begin
                             i :=  PORTC.B3 ;
                             i :=  sbit at PORTC.B3;
    
                      end;
                      Ausgabe;

      end;



 begin
      DDRC := 0x00 ;         //port auf eingang
      DDRB := 0xff ;        //port auf ausgang
      PORTB := 0xff ;       //alle ausgaänge port b aus
       Delay_ms (3000) ;

      incoming_IR_yes := false;
       PORTB.B5 := 0x00 ;    //dide 1 an    an is 0x00
       PORTB.B3 := 0x00 ;
       PORTB.B1 := 0x00 ;
       Delay_ms (500) ;
       PORTB.B5 := 0x01 ;     //diode aus   aus is 0x01
       PORTB.B3 := 0x01 ;
       PORTB.B1 := 0x01 ;
       Delay_ms (2500) ;



      Abfrage_infrarot_eingang;




end.

Problem ist nun, dass wenn ich auf den Eingang PortB.B3 eine 1 setze, 
wird die Ausgabeprozedur nicht aufgerufen.
Ich hab das erstmal am SKT500 ausprobiert? hat jemand eine Idee,

Ich bin schon ziemlich ratlos, daher auch die vielen auskommentierten 
Codestückchen...

Vielen Dank im Vorraus

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsren Wessling schrieb:

>     procedure Abfrage_infrarot_eingang  ;      // oder alles als

>           {while PORTC.B3 <> 0x00 do
> // unendlich schleife start

Das ist keine unendliche Schleife.
Die Schleife hängt ganz eindeutig von einer Bedingung ab.
Was passiert, wenn die Bedingung nicht mehr, oder noch nicht erfüllt 
ist?

> Ich bin schon ziemlich ratlos, daher auch die vielen auskommentierten
> Codestückchen...

Du hast IMHO falsch angefangen.
Das wichtigste war, dass dein µC am Anfang eine Blinkerei inszeniert, 
damit da was zum schauen hast. Quasi ein 'Willkommen' auf µC Art. Das 
ist als Vortest nicht schlecht, aber im Grunde ist es für dein 
eigentliches Programm völlig unwichtig und raubt dir momentan nur die 
Übersicht.

Fang nochmal an.
Aber diesmal soll dein erster Zwischenschritt sein:

Dein Programm bedient 2 LED
Am Programmanfang wird die eine eingeschaltet und die andere aus.
Dann geht das Programm in die obligatorische Endlosschleife über
  In der Endlosschleife fragt es ständig den Input Pin ab
  Ist der auf 0, dann passiert nichts
  Ist der aber auf 1, dann schaltet dein Programm die beiden LED um.
    Die leuchtende wird ausgeschaltet, die nicht leuchtende ein


Dieser Programmansatz ist klein genug, dass du dir nicht wieder selbst 
die Übersicht raubst.
Und nein. Mach das erst mal ohne procedure. Das sind nur ein paar Zeilen 
Code.

Und wenn das dann funktioniert, dann baust du es aus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Pascal ist schon etwas rostig und auf einem AVR hab ich noch nie 
Pascal benutzt, aber so in etwa müsste das aussehen
program geo;

begin
  PORTC := 0x00;     // Port C auf Eingang
  PORTB := 0xFF;     // Port B auf Ausgang

  PORTB.B1 := 1;     // die eine LED ein
  PORTB.B5 := 0;     // die andere LED aus

  while 1 = 1 do begin       // Hauptschleife. Innerhalb dieser
                                // Schleife wird die ganze Arbeit gemacht

    if PINC.C3 = 1 then begin   // ist vom IR was gekommen?
      PORTB.B1 := 0;            //   dann die eine LED aus
      PORTB.B5 := 1;            //   und die andere LED ein
    end;

  end;
end.

Autor: ka-long (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich weiss, selber bauen macht Spaß.

Aber schau mal hier die Diskussion an:
http://www.geoclub.de/viewtopic.php?f=57&t=40079

Gruß ka-long

Autor: Torsren W. (deidextra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke für eure schnellen antworten.
@ Karl Heinz:

Das mit dem rumgeblinke ist noch drin geblieben, um zu überprüfen ob ich 
meine Schaltung richtig gelötet habe und jetzt im nachhinnein um 
herauszufinden, ob der Controller in die Ausgabeprozedur springt.

Werde das mal nach deinem Rat schlanker gestallten und mich dann nochmal 
melden, ob das so hingehauen hat!
Danke nochmal!

Autor: Torsren W. (deidextra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleines Update hierzu:

Ich habe Euren Rat befolgt und das Programm nochmal ganz von vorne 
angefangen.
Ich konnte das Programm endlich vernünftig struckturieren und habe es 
geschafft die LEDs zum richtigen Blinken zu bekommen!
Danke nochmal für Euren guten Rat!

Und grade weil ihr mir so gut geholfen habt, habe ich nochmal eine 
Bitte!
könntet ihr nochmal über meinen(verkürzten) Code schauen.
Ich habe den extra eingekürzt, weil 200 Zeilen in denen nur LEDs an und 
wieder ausgemacht werden, sind für Euch ja wahrscheinlich uninteressant!

Mein Problem ist folgendes:
Die Aktivierung per IR-Empfänge funktioniert einwandfrei. Nachdem der 
Blinker aktiviert worden ist, soll erstmal eine grüne LED für 2 Sekunden 
leuchten, um den Benutzer darauf vorzubereiten, dass gleich was 
passieren wird. Dannach soll der Morsecode mit der Blauen LED starten. 
dann leuchtet nochmal die grüne LED, denn dannach startet eine rote LED 
mit der Anzeige des anderen Morsecodes. Dannach ist Ende. der Controller 
wartet wieder auf eine erneute Aktivierung.

Es funktioniert fast alles: und mit fast mein ich auch wirklich nur eine 
Kleinigkeit.
Die grüne LED leuchtet am Anfang nicht. es startet sofort die blaue LED 
mit der Übertragung. dannach leuchtet die grüne LED so wie es sein soll, 
und die Rote LED arbeitet auch vernünftig.

Hier mein verkürzter Code: vielleicht findet ihr ja den Grund dafür!
program Geocaching;

{ Declarations section }
 (*              //OUTPUTS
     //  LED GRÜN  ==  PORTB.B1
     //  LED BLAU  ==  PROTB.B3
     //  LED ROT   ==  PORTB.B5

             //INPUT
     //  TSOP   == PINC.C3
     
        *)


begin

    DDRB := 0xFF;         //Ports B auf Ausgang
    
    DDRD := 0x00;         //Ports D auf Eingang

    PortB.B1 := 0x00;
    Portb.B0 := 0x00;
    Portb.B2 := 0x00;
    Portb.B3 := 0x00;      //schaltet alle LED aus
    Portb.B4 := 0x00;
    Portb.B5 := 0x00;
    
    
    
    while TRUE  do
    begin

         if PINC.B3 = 0 then
         begin
         //Bereit halten mit grüner LED 2Sek
         PORTB.B1 := 0x01;                            //Dieser Teil, also das An- und Ausschalten von PORTB.B1, es scheint, als würden diese 3 Zeilen übersprungen, funktioniert nicht! Keine Ahnung warum nicht, aber
         delay_ms(2000);
         PORTB.B1 := 0x00;
         
         
    //   Übermittlung der Nördlichen Breite
    //5
               PORTB.B3 :=0x01;
              delay_ms(300);          //dit
              PORTB.B3 := 0x00;

              delay_ms(300);          //Symbolabstand                 //funktioniert einwandfrei, hab das nur abgekürzt.

              PORTB.B3 :=0x01;
              delay_ms(300);          //dit
              PORTB.B3 := 0x00;

      (*Hiernach wird mit dem Ein- und Ausschalten der LEDs weiter gemacht.
      bis dann das hier folgt.*)



   //Bereit halten mit grüner LED 2 Sek
         PORTB.B1 := 0x01;
         delay_ms(2000);
         PORTB.B1 := 0x00;                          //das funktioniert auch einwandfrei


   // Übermittlung der östlichen Länge

   //0
              PORTB.B5 :=0x01;
              delay_ms(900);          //dah
              PORTB.B5 := 0x00;
                                                                        //Funktioniert ebenfalls.
              delay_ms(300);          //Symbolabstand

              PORTB.B5 :=0x01;
              delay_ms(900);          //dah
              PORTB.B5 := 0x00;





         end;
         PORTB.B1 := 0x00;
         PORTB.B3 := 0x00;
         PORTB.B5 := 0x00;
    end;


    
end.

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.