- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Eingang abfragen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    02.10.2006
    Beiträge
    32

    Eingang abfragen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich versuche gerade meinen mega32 davon zu überzeugen einen Eingang abzufragen, komme dabei aber nicht weiter.

    Ich habe Pin A0 als eingang definiert und mit einem Taster versehen welcher auf + landet. Weiter habe ich pin C0 als Ausgang definiert und an - angebunden dazwischen eine LED. Nun habe ich volgendes Programm geschrieben.

    Ziel PC0 mit demTaster wieder aus zu schalten.

    #include <avr/io.h>
    #include <stdint.h>

    int main(void)
    {
    DDRA &= ~( 1 << PA0 ); /* PIN auf Eingang (Taster) */
    PORTA |= ( 1 << PA0 ); /* Pullup-Widerstand aktivieren */
    DDRC = (1 << DDC0); // pin c0 als ausgang
    PORTC |= (1<<PC0); // CPort C0 auf high
    if ( !(PINA & (1<<PINA0)) ) // Port A0 = 0 dann mache was
    {
    PORTC &= ~(1<<PC0); // Port C0 auf low
    }
    }

    PCO geht auf high aber lässt sich nicht mehr über A0 ausschalten. Spannung bei A0 (Taster nicht gedrückt > 0,7*Vcc also =1, Taster gedrückt <0,2*vcc also = 0).

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Dein Programm enthält keine Endlosschleife. Das Programm wird durchlaufen und am Ende weiß der µC nicht mehr, was er machen soll und macht wohl zumindest nicht mehr das, was er soll. Du musst also noch eine Endlosschleife einbauen, in der du den Eingang ständig abfragst und dann dementsprechend den Ausgang setzt.

    Schau dir am besten erst nochmal ein Tutorial zur C-Programmierung eines AVRs an. Gibts z.B. unter www.mikrocontroller.net

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Wie legst du Pin A0 auf 0V wenn der Taster auf +5V geht und der PullUp aktiv ist. Am besten Taster auf GND und PullUp aktiv.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Du benötigste - wie schon vorher gepostet - eine Schleife, innerhalb der Dein Taster abgefragt wird, sonst geschieht die Abfrage nur einmal:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    int main(void)
    {
        DDRA &= ~( 1 << PA0 ); /* PIN auf Eingang (Taster) */
        PORTA |= ( 1 << PA0 ); /* Pullup-Widerstand aktivieren */
        DDRC = (1 << DDC0); // pin c0 als ausgang
        PORTC |= (1<<PC0); // CPort C0 auf high
        for( ;; )
        {
            if ( !(PINA & (1<<PINA0)) ) // Port A0 = 0 dann mache was
            {
                PORTC &= ~(1<<PC0); // Port C0 auf low
            }
        }
    
        return 0;
    }
    Wenn jetzt der Taster gedrückt wird, geht PortC.0 auf low. Danach bleibt der Pin auf 0, egal was passiert. Du musst natürlich dafür sorgen, dass PinA.0 bei nicht gedrücktem Taster auf High-Potenzial liegt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.09.2005
    Ort
    am Bodensee
    Beiträge
    217
    hi,

    also hmm ^^ für nen Anfänger ne for(; schreiben hmm is gewagt *gg*

    *fangen wir mal an*

    als minimal programm

    Code:
    #include <avr/io.h>
    		
    // deine Headerfiles oder Include files ...
    
    int main(void)			
    
    // die Funktion main brauchst immer is ebend main ^^
    // void bedeutet grob gesagt nur "nichts"
    // das hier wird nur beim Prozessor Start ausgeführt
    
    { 
    
    unsigned int variable_uint;	
    
    // hier kannst du ja mal die Inizialisierung machen
    // z.b. DDR der Ports Setzen und anderes..
    
    	while(1)			
    
    // while(1) <- das du immer im kreis rennst
    
    	{
    	variable_uint++;		
    
    // einfach als Demo variable_uint wird hochgezählt
    // hier machst dein Programm das immer im kreis rennen soll
    
    	}
    }

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    02.10.2006
    Beiträge
    32

    Danke Leute

    for( ;; )
    {
    if ( (PINA & (1<<PINA0)) // Port A0 = 0 dann mache was
    {
    // PORTC &= ~(1<<PC0); // Port C0 auf low
    PORTC |= (1<<PC0);
    }

    das Funzt , habe aber immer noch einen Knoten zwischen den Ohren vermute ich, egal ob ich

    if ( (PINA & (1<<PINA0)) // Port A0 = 1 dann mache was
    oder if (!( (PINA & (1<<PINA0))) // Port A0 = 0 dann mache was

    immer wenn ich auf GND gehe wird die aktion in der Schleife durchgeführt. Wenn ich auf + gehe passiert nichts. Da werde ich noch viel lernen müssen

    Danke und Gruß
    Tötzel

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.09.2005
    Ort
    am Bodensee
    Beiträge
    217
    hehe deine kommentare könnten dich selbst verwirren ^^

    = Zuweißung
    == Abfrage

    (nur ma am rande)

    dann

    Code:
    if ( (PINA & (1<<PINA0)) // Port A0 = 0 dann mache was
    ich glaub dir nicht das das durch deinen Compiler gelaufen ist ^^ da ist def. eine ( zuviel oder eine ) zuwenig

    dann du schreibst zwar schön dahinter Port A0 = 0 .. aber frägst auf Port A0 = 1 ab ^^

    sollte so heißen

    Code:
    if (!(x & (1<<0)))
    also für dein bsp.

    Code:
    if (!(PINA & (1<<PINA0)))
    das frägt nun auf 0 ab

    und pass immer auf deine Klammersetzung auf .. das gibt dir sons fehler ohne ende und du weißt im ersten mom nicht mal was falsch is da die schelcht auffallen..



    mfg

    bluelight[/quote]

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    02.10.2006
    Beiträge
    32

    Danke für eure Antworten

    Ich habe zwei Fehler gemacht.

    Zum einen Taster auf GND um A0 auf 0 zu setzen ( hätte in E-technik mal besser aufpassen sollen ) Habe da einfach immer gegen VCC gemessen und nicht gegen GND.

    Das mit den Klammern stimmt auch, ist durch zu vieles hin und herprobieren gekomen, stimmt läuft so nicht durch den Kompiler. Nun lässt sich meine LED aber ausschalten und ich werde ich mal den analogen Eingängen witmen.

    Vielen Dank noch mal

    Gruß
    Tötzel

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.01.2006
    Ort
    Irgendwo im Nirgendwo
    Alter
    50
    Beiträge
    62
    Mojn,

    warum benutzt ihr nicht die schon vorhandenen Makros z.B.:

    if (bit_is_clear(PINA,PA0))
    ...

    bzw.
    if (bit_is_set(PINA,PA0))
    ...

    EDIT: Die Marcros sind übrigens in der "sfr_defs.h" drin und werden über die "io.h" includet!

    Gruß, Bernd

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.09.2005
    Ort
    am Bodensee
    Beiträge
    217
    hehe theoretisch hast du recht ja .. aber ich nutz n icc und hab da andere macros (selbst gemachte) da ich ihn auch Beruflich nutz und deshalb gewöhn ich mich halt nicht gern um

    darum entweder direkt oder meine macros *g* da ich hier meine macros nicht bringen brauch direkt

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen