- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: BackLEDs unabhängig voneinander einschalten?

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    jetzt wird es hier kompliziert....
    Mit Hilfe der tollen Tutorials auf deiner HP habe ich nun endlich auch die Timergeschichte kapiert und damit auch die nächste Hürde genommen:
    Danke für die Rosen,
    Wo Du es ansprichst, ich glaube es wird Zeit weiterzuschreiben, habe aber seit dem Umzug noch nichtmals meinen Desktop aufgebaut....

    Dein Code sieht schonmal gut aus, mit dem Timerwert würde ich mir keine Gedanken machen, es ist schon OK so, schlimmer wäre, wenn Du in der main Routine eine Zahl > 8 Bit veränderst, die ev. in einem Interrupt gebraucht wird, dann knallt es irgendwann, ist auch klar warum , oder ?
    da muß man cli() sei() benutzen...
    Aber da Du den Overflowflag pollst...
    Achja, apropo Flag, das löschen von TOV1 geht bei Dir mit dieser Zeile
    Code:
    TIFR |= 0b00000100;
    das ist aber schlecht, warum, überleg mal man löscht einen Flag indem man eine eins in TIFR schreibt, das machst Du auch, aber was passiert, wenn sonst ein Flag in TIFR gesetzt ist(Irgendein 2. Timer)?
    Na klingelt es?
    Wenn Du es veroderst, schreibst Du eine eins in alle Flags rein, die gesetzt sind...
    es sieht etwas komisch aus, aber so ist es richtig:
    Code:
    TIFR = 0b00000100;
    ist sehr wichtig, bevor Du irgendeinen anderen Timeroverflow verlierst...

    @M1.R

    Das Problem bei Dir sind mangelnde C Kenntnisse, aber es kommt noch
    DDRC ist Data Directory Register für PortC(hat mit der Deutschen demokratischen Republik nichts zu tun *lol*), Wenn hier ein Bit 1 ist, ist der Pin als Ausgang konfiguriert, bei 0 als Eingang.
    Am sonsten sieht es schonmal gut aus nur wenn Du einen Bit löschen willst geht das so:
    Code:
     //linke BackLED aus 
       PORTC &=~(1<<PC1); 
       Msleep(3000); 
    
       //rechte BackLED an 
       PORTC=(1<<PC0); 
       Msleep(3000); 
    
       // an dieser Stelle soll die linke BackLED angehen, ohne die rechte zu beeinflussen 
       // jetzt geht die rechte aber aus 
       // ??????????????????????? 
    
       PORTC |= (1<<PC1); 
       Msleep(3000);
    das sind jetzt ziemlich komische Zeichen(C Gegner bezeichnen es als Hyroglyphen) es kommt aber davon, daß C Programmierer faul sind und ungern viel tipen (sei froh, daß es kein Perl ist, da ist es noch schlimmer )

    aber PORTC |= (1<<PC1); könnte man auch so schreiben :
    PORTC = PORTC | (1<<PC1);
    also nimm den alten Zustand von Port C und veroder ihn mit PC1 (00000010)

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Das ist ja krass, schon das Löschen des Flags per Setzen ist ja unerwartet. Aber dass man per oder-Verknüpfung ein zufällig auch noch gesetztes Flag mitlöscht, darauf muss man erst mal kommen. Da eine geschrieben 0 nichts löscht, ist TIFR= klar. Danke für Warnung, das ist eine üble Falle. Hätte ich ja eigentlich selbst erkennen können:

    ldi arbeitsregister,(1<<TOV1)
    out TIFR,arbeitsregister


    Ich vermute, ein Interrupt könnte bei Werten > 8Bit genau zwischen HByte und LByte reinfunken, aber zu den Interrupts werde ich wohl erst morgen kommen.

    Bitte entschuldigt auch, dass ich mich so mit in den Thread reingedrängt habe, aber ich brauche immer 'nen kleinen Tritt, damit ich mich bewege. Und das war eben diesmal das Setzen der BackLEDs und die geforderte Pause ohne Libary.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ja, Fehler, die man selber gemacht hat, vergißt man nie

    Das verodern bei TIFR ist auch recht einfach zu erklären, wenn man sowas in Assembler geproggt hat, also was erwartet man vm Kompiler bei dieser Zeile
    Code:
    TIFR |= 0b00000100;
    Idealerweise sowas
    Code:
    sbi TIFR,0b00000100
    Damit hätten wir in einem Takt schön Bit 2 in TIFR geschrieben, fertig.
    Das geht leider nicht...
    Bei TIFR(und auch anderen Registern) funktioniert sbi nicht
    das bleibt dem Kompiler(und dem Assemblerprogrammierer) nichts anderes über als das ganze über einen Arbeitsregister zu machen:
    Code:
    in r16,TIFR
    ori r16,0b00000100
    out TIFR,r16
    auf den ersten Blick kein Problem, aber wie gesagt man löscht sich damit alle anderen Flags.
    Ich hoffe etwas Licht in die Sache gebracht zu haben, aber freu Dich, wenn Du einen Interrupt benutzt wird der Flag automatisch gelöscht
    Wenn man auf dem Low Level programmiern will, muß man schon ziemlich im Dattenblatt lesen, das machen leider die wenigsten
    Kennst Du schon diesen Artikel ?
    Ist sehr lesenswert, auch wenn der mal ganz einfache Fehler behandelt, die Du mit Sicherheit nicht mehr machst

    Wir werden aber wirkilich ziemlich OT hier...

    Gute Nacht

    Gruß Sebastian

    PS
    Code:
    ldi arbeitsregister,(1<<TOV1) 
    out TIFR,arbeitsregister
    ups, das habe ich gerade erst gelesen(ich hab wohl was an den Augen)
    genau, sowas dürfte bei TIFR = 0b00000100;
    rauskommen ...
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #14
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Zitat Zitat von izaseba
    Das Problem bei Dir sind mangelnde C Kenntnisse, aber es kommt noch
    Na ja - hoffentlich

    Vielen Dank!!!

    hier habe ichs jetzt eingebaut:

    https://www.roboternetz.de/phpBB2/viewtopic.php?t=31867

    Gruss
    M.

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Ha, ich bin wieder im Topic, weil mir aufgefallen ist, dass bei meinen Programm die grüne StatusLED und die BackLEDs(unterschiedlich hell) weiterglimmen. Bei der StatusLED liegt es wohl an den internen Pullups, die müssen aus sein. Die BackLEDs liegen mit der Kathode an PD7, deshalb gehen die aus, wenn man diesen Ausgang setzt:

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    unsigned int timer_startwert=65536-7812; // 8MHz/1024=7812,5
    int main(void)
    {
    	DDRB=0; // nicht benoetigte Ports auf Eingang setzen
    	PORTB=0; // und die Pullups aus, sonst "glimmt" die StatusLED gruen
    	DDRC=0;
    	PORTC=0;
    	DDRD=(1 << PD2); //rote StatusLED haengt an PD2(= Port D, Bit2)
    	DDRD|=(1 << PD7); // Kathoden der BackLEDs haengen auf PD7
    	PORTD=(1 << PD7); // high an PD7 schaltet die BackLEDs aus
    
    /* Es folgt eine Einschaltverzögerung von ca. 1 Sekunde */
       TCNT1=timer_startwert; // 16-Bit auf einmal laden?
       TCCR1B |= 0b00000101; // Prescaller Timer1 auf 1024 setzen
       while(!(TIFR & (1 <<TOV1) )); //Warten bis Überlauf Timer1
       TCCR1B &= ~0b00000101; // Prescaller löschen bedeutet Timer1 stoppen
       TIFR = (1 << TOV1); // Flag setzen bedeutet Flag wieder löschen
    
    	while(1) PORTD=(1 << PD7) | ((PINC & (1<<PC4))  >> 2); // eine Taste schaltet StatusLED aus
    
    	return(0);
    }
    Das heißt aber auch, wenn man die BackLEDs einschalten will, muss man zusätzlich zu PC0/PC1 noch PD7 als Ausgang definieren und ein Low ausgeben. Dann gehen auch D13/14 aus, deshalb funktionieren BackLEDs und Odometrie nicht zusammen. Oder sehe ich das falsch?

    ich hab wohl was an den Augen
    War ein [Edit] meinerseits

    Schöne Nacht wünsche ich euch auch

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests