- Labornetzteil AliExpress         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 37 von 37

Thema: RC-Kanal einlesen, Code in C

  1. #31
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Habe jetzt die Masseleitung gelegt. Hat sich nichts geändert.

    Aufgefallen ist mir, dass die per RC geschalteten LEDs jede Sekunde kurz ausgehen (ansonsten beständig an) und die 1-Sek-Blink-Leds alle 2 Sek kurz aufblitzen.

    Sobald ich den Signalpin aus dem Empfänger ziehe, blinken die Blink-Leds wie programmiert im 1sek-Rhythmus. Die RC-Leds sind aus (entsprechend der Programmierung).

    Hier der aktuelle Code nochmal:


    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    
    /*void blitz()
    {
        PORTA = (1<<PA1);
        _delay_ms(1000);
        PORTA = (0<<PA1); 
    }
    
    void beacon()
    {
        PORTA = (1<<PA0);
        _delay_ms(1000);
        PORTA = (0<<PA0);
    }
    */
    ISR(INT0_vect)
    {
        static int reading;
        static int rc_value;
        
        if(reading == 0)
        {
            TCNT0 = 0;
            MCUCR = (0<<ISC00) | (1<<ISC01);
            reading = 1;
        }
        else
        {
           rc_value = TCNT0;
           TCNT0 = 0;
           MCUCR = (1<<ISC00) | (1<<ISC01);
           reading = 0;
        }
        
        if(rc_value > 150)
        {
             PORTA = (1<<PA2);
        }
        else
        {
             PORTA = (0<<PA2);
        }
      
    }
    
    int main(void)
    {
        DDRA = 0xFF;
        PORTA = 0xFF;
        DDRB = 0x00;
        
        TCCR0B = (1<<CS01);
        MCUCR = (1<<ISC00) | (1<<ISC01);
        GIMSK = (1<<INT0);
        sei();
        
    /*    while(1)
        {
            blitz();
            _delay_ms(150);
            blitz();
            _delay_ms(350);
            beacon();
            _delay_ms(500);
                                
        }  
    */
    
    while(1)
    {
            PORTA = (1<<PA0) | (1<<PA1);
            _delay_ms(1000);
            PORTA = (0<<PA0) | (0<<PA1);
            _delay_ms(1000);
    }
    }

  2. #32
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    54
    Beiträge
    524
    Hallo,

    der Tiny schaltet nicht einfach die 5V am Ausgang ein und aus. Er schaltet zwischen 5V und GND hin und her. Wenn der Ausgang Logisch 0 ist, hat der Pin GND Potential und hängt nicht wie bei einem Schalter in der Luft.

    Okay, ich hatte es jetzt so verstanden, dass du gar keine GND-Verbindung hast.

    So, habe mir noch einmal deinen Code angeschaut. Da haben wir etwas fürchterlich übersehen.

    Wenn du
    PORTA = (1<<PA1);
    schreibst wird der komplette Port A geändert, auch PA2. Du könntest auch PORTA = 2; schreiben.

    Bei
    PORTA |= (1<<PA1);
    wird nur PA1 geändert. Alle anderen Ausgänge an A bleiben unverändert.
    Da gleiche gilt für
    PORTA = (0<<PA2);
    Hier könntest du auch gleich PORTA = 0; schreiben.
    PORT &=~(1<<PA2);
    Setzt wieder nur PA2 auf low.


    Gruß

    Jens

  3. #33
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    Ohhhhhh verdammt

    Also:

    PORTA |= (1<<PA1); um NUR PA1 auf 1 zu setzen, den Rest unberührt zu lassen.

    PORTA &=~(1<<PA1); um NUR PA1 wieder auf 0 zu setzen.

    Und das dann analog mit den anderen Pins.

    Richtig? Werds direkt probieren... Wäre ja phänomenal

  4. #34
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    DER WAHNSINN!!!

    Weiß garnicht wie ich dir danken soll.... Es funktioniert wunderbar!

    Endlich Schwere Geburt... Was diese kleinen Fehlerchen alles ausmachen können...

    Hab sonst immer direkt mit Hexwerten den ganzen Port beschrieben und bisher wenig mit direkten Bitoperationen gearbeitet.

    DANKE!!!

  5. #35
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    Zitat Zitat von McJenso
    der Tiny schaltet nicht einfach die 5V am Ausgang ein und aus. Er schaltet zwischen 5V und GND hin und her. Wenn der Ausgang Logisch 0 ist, hat der Pin GND Potential und hängt nicht wie bei einem Schalter in der Luft.
    Das ist beim mega32 aber anders oder? Dort werden die Pulldowns/ups doch gebraucht!?

  6. #36
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    54
    Beiträge
    524
    Hallo,

    nö. Wenn der Pin als Ausgang konfiguriert ist, kann er nur Vcc oder GND annehmen.
    Wenn der Pin Eingang ist, kann er Tri-state (kein Potential) oder über zuschaltbaren internen Pullup Vcc annehmen. Wird ein Pulldown benötigt, muss dieser extern angeschlossen werden.

    Das ist bei allen mir bekannten AtMegas und AtTinys der Fall. Du findest die Ports unter I/O Ports im entsprechenden Datenblatt beschrieben.

    Gruß

    Jens

  7. #37
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    Ok, also nur bei Eingängen... Macht irgendwo auch Sinn... Wieder was gelernt...

    Danke!

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress