-         

Ergebnis 1 bis 5 von 5

Thema: AVR allgem. Frequenz erzeugen Intern EEprom schreiben/lesen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91

    AVR allgem. Frequenz erzeugen Intern EEprom schreiben/lesen

    Anzeige

    So gleich noch eine Frage:

    Der AVR soll eine ein Signal (Rechteck) mit variabler Frequenz erzeugen. Dazu will ich den 8-Bit oder 16-Bit Timer verwenden. Nun die eigentliche Frage, der Controller muss noch andere Aufgaben erfüllen, wie parallele Kommunikation zu mit einem Übergeordnetem System. Wie geht man das am geschicktesten, dass sich das generierte Signal nicht bzw. kaum durch die zusätzlichen operationen ändert?

    Dann ist meine nächste Frage, wie komme ich unter Bascom an das interne EEprom um darin Parameter zu speichern(kommen vom übergeordneten System, sollen aber erst überprüft werden und bei übereinstimmung nicht neu geschrieben werden), die selten verändert werden und wie kann ich mit Bascom die Werte aus dem EEprom lesen?

    Der verwendete AVR soll ein AT90S8515-8 sein


    Schon mal vielen Dank für Eure Hilfe.

    Gruß

    Sven

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Sven,

    die Rechteckerzeugung der Timer komplett alleine. Stichwort ist "Compare".
    Bei einem Compare-Match, d.h. der Zählerstand stimmt mit dem im Compare-Register gespeicherten Wert überein, kann der Timer 1) einen Pin toggeln (welcher ist fest vorgegeben -> Datenblatt) und 2) den Timer neu starten. Du erhälst so ein Rechtecksignal mit 1:1 Impuls-Pausenverhältnis.
    Wenn der Wertebereich des Timers nicht ausreicht, dann muß man den Overflow-Interrupt mit hinzunehmen.
    Timer0 hat i.a. keine Compare-Unit. Timer1 und 2 besitzen in der Regel eine.

    Für den EEprom Zugriff gibt es bei Bascom 2 unterschiedliche Wege. Erstens via "Readeeprom" und "Writeeeprom" und zweitens durch Definition von Variablen als ERAM.

    Größere Datensätze würde ich eher mit Read-/Writeeeprom lesen und schreiben, einzelnen Werte gehen besser mit "Dim Var as ERAM type".

    Ein Fallstrick bei Eram-Variablen ist, das man sie nicht für alle Funktionen verwenden kann. Ggf. müssen sie vorher in eine 'normale' RAM-Variable umkopiert werden.

    Ciao,
    Werner

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Hallo Werner,

    danke für die Antwort. Das mit dem Timer ist mir allerdings noch nicht so ganz klar. Hast da vielleicht ein kleines Beispiel? Wenn ich sowas mit etwas code sehe ists mir doch irgendwie immer verständlicher.

    Gruß

    Sven

  4. #4

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Sven,

    Code:
    '-------------------------------------------------------------
    'Beispiel für die Verwendung der Capture-Unit als Rechteckgenerator
    '-------------------------------------------------------------
    $crystal = 8000000
    $regfile = "m8515.dat"
    
    
    ' ## Configuration
    ' I/O
    Config Pind.5 = Output
    ' Hardware
    ' Timer1 als Timer, Vorteiler=256, bei CompareA-Treffer PinD.5 toggeln
    Config Timer1 = Timer , Prescale = 256 , Compare A = Toggle
    ' Interrupts
    On Compare1a Timer_loeschen Nosave       ' Wenn CompareA-Treffer, dann...
    Enable Compare1a
    Enable Interrupts
    
    ' ## Definitionen
    Dim Wert As Word
    
    ' ## Initialisierung
    Wert = 20000                      'Timer1 zählt bis 20.000 und toggelt dann PinD.5  
    Compare1a = Wert              'Wert ins Compare-Register schreiben
    
    ' ## Hauptprogramm
    Do
    Loop
    ' ## Hauptprogramm ende
    End
    
    ' ## Interrupts
    Timer_loeschen:            ' Wenn Wert erreicht, dann
    Timer1 = 0                    ' Timer1 löschen
    Return
    Der Weg den das vielgepriesene Tool geht, geht auch und ist bei niedrigen Frequenzen sogar besser. Bei hohen Frequenzen ist der Weg über Compare günstiger.
    Zudem lassen sich, wenn man in der Interrupt Routine nicht Timer1=0 sondern Timer1 = Timer1 + Wert setzt, zwei unabhängige Rechtecksignale mit nur einem Timer erzeugen. Die Erzeugung des zweiten geht dann analog über Compare1B.

    Gruß Werner

Berechtigungen

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