- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Frage zu Software Uart mit TimerOverflow Interrupt

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1

    Habs mal mit 38400 Baud getestet funktioniert wunderbar....

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Habs mal mit 38400 Baud getestet funktioniert wunderbar....

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #include "init.h"
    #include "lcd.h"
    
    
    //SoftUART PINS
    #define RXPIN 2
    #define RXINT INT0
    #define UARTDDR DDRD
    #define UARTPIN PIND
    #define UARTPORT PORTD
    
    #define T0REL 204
    #define T0WAIT 48
    
    char iOut[20];
    
    unsigned char sFlag = 0;
    unsigned char bitCnt = 0;
    unsigned char udr = 0;
    
    
    void cfgInt0(void)
    {
        MCUCR |= (1<<ISC01);        //INT0 falling edge
        GICR |= (1<<INT0);            //INT0 interrupt enable
    }
    
    void cfgTimer0(void)
    {
        TCNT0 = T0WAIT;
        TCCR0 = 1;                    //pre = 1
        //TIMSK |=(1<<TOIE0);
    }
    
    void cfgSoftUart(void)
    {
        UARTDDR &=~ (1<<RXPIN);        //RX Pin als Input
        UARTPORT &=~ (1<<RXPIN);    //RX Pin auf 0
    
        cfgInt0();                    //Software UART Interrupt
        cfgTimer0();                //Software UART Timer
    }
    
    
    int main(void)
    {
        cfgPorts();
        cfgSoftUart();
        cfgLcd(LCD_ON_CURSOR_OFF);
        lcdCls();
        enableInterrupts();
    
        _delay_ms(200);
        lcdPrint("Software Uart",1,1);
    
        while(1)
    
        {    
            itoa(udr,iOut,10);
            lcdPrint("                    ",1,3);
            lcdPrint(iOut,1,3);
            itoa(udr,iOut,2);
            lcdPrint(iOut,5,3);
            
            _delay_ms(1000);
        }
          return 0;
    }
    
    
    ISR(INT0_vect)
    {
        GICR &=~ (1<<INT0);
        TCNT0 = T0WAIT;
        TCCR0 = 1;
        TIFR |= (1<<TOV0);
        TIMSK |=(1<<TOIE0);
    }
    
    ISR(TIMER0_OVF_vect)
    {
        TCNT0 = T0REL;
    
        if(sFlag == 0)
        {
            sFlag = 1;
            TCCR0 = 2;
        }else
        {
            if(!(PIND & (1 << PD2)))
            {
                udr &=~ (1<<bitCnt++);
            }else
            {
                udr |= (1<<bitCnt++);
            }
        }
        if(bitCnt == 8)
        {
            bitCnt = 0;
            sFlag = 0;
            TIMSK &=~(1<<TOIE0);
            GIFR |= (1<<INTF0);
            GICR |= (1<<INT0);
        }
    
    }
    mal gucken wie sowas mit ctc aussieht.....
    noch mal super herzlichen dank !
    mfg Fugitivus

  2. #12
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    TIFR |= (1<<TOV0);
    GIFR |= (1<<INTF0);
    Das ist nicht korrekt. Damit löscht du gleich alle gesetzten Flags in dem jeweiligen Register. Bei deinem aktuellen Code ist es egal, ob nur ein bestimmtes Flag gelöscht wird, oder gleich alle, aber wenn du deinen Code dann mal erweiterst und mehr Interrupts benutzt, dann wird dich das irgendwann in den Hintern beißen.
    MfG
    Stefan

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1

    wie jetzt ?

    Erst mal Danke für den Hinweis !

    verstehe ich nicht so ganz.... weil ich es rein shifte ?

    also im Datenblatt steht doch clear durch schreiben einer 1 für das entsprechende flag....

    also statt

    Code:
    GIFR |= (1<<INTF0);
    besser

    Code:
    GIFR |= 64; //???
    bitte um genauere Erklährung

    Hier noch mal Datenblattauszug:

    • Bit 6 – INTF0: External Interrupt Flag 0
    When an event on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the Ibit
    in SREG and the INT0 bit in GICR are set (one), the MCU will jump to the corresponding
    Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag
    can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured
    as a level interrupt.

    würde mich sehr freuen wenn du mir das genau erklährst...

    Mfg Fugitivus

  4. #14
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Ausgeschrieben bedeutet es

    GIFR = GIFR | 64;

    und bewirkt, daß alle beim Auslesen von GIFR gesetzten Bits auch wieder geschrieben und deshalb mitgelöscht werden.

    "...the flag can be cleared by writing a logical one to it." mit |= betrifft alle zu diesem Zeitpunkt gesetzten Flags!
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1

    Beitrag also &= ?

    also nen logisches & ?

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    sprich (wenn ich das richtig verstanden habe):

    1100 0000
    0100 0000 AND
    0100 0000 =

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Ein schlichtes GIFR = 64; genügt. Dann wird nur dieses Bit mit "1" beschrieben und alle anderen Bits mit einer auf Flags wirkungslosen "0".
    Geändert von radbruch (27.11.2011 um 12:32 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    aber, jetzt mal rein um mir das brett wieder vom kopf zu nehmen währe das und auch ok ?!?
    und wo wir schon mal dabei sind, ich habe nie den unterschied zwischen or und xor verstanden....
    lust mir den mal gerade nahezulegen ?

    das das mit dem or nicht klappt ist ja irgendwie logisch, manchmal sollte man mal nachdenken bevor man drauf los proggt ^^

    Mfg Fugitivus

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Das "UND" wäre hier schon richtig. Allerdings unnötig und letzlich auch verwirrend, denn der ursprüngliche Inhalt des Registers interessiert ja gar nicht. Es soll lediglich die "1" ausgegeben werden um das Flag zu löschen.

    Hier muss man sich von den gewohnten Formulierungen mit |= oder &= lösen, denn es geht nicht um einen Pin in einem Port dessen Pegel einzeln gewechselt werden soll.
    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

Ähnliche Themen

  1. Software Uart, Interrupt möglich?
    Von hunni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 07.03.2011, 16:53
  2. Frage zu Software Uart
    Von Blamaster im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 29.06.2008, 12:35
  3. Interrupt bei Software UART?
    Von coCo im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 30.11.2006, 16:22
  4. Interrupt (Oder Trick)beim Software Uart
    Von frank-wob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 09.08.2006, 10:43
  5. Ampelsteuerung, AVR AT90S8535 ,TimerOverflow Interrupt
    Von gizzi im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 18.05.2006, 18:51

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress