PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR allgem. Frequenz erzeugen Intern EEprom schreiben/lesen



ACsenf
22.03.2005, 12:10
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

Werner_Just
22.03.2005, 12:50
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

ACsenf
22.03.2005, 13:08
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

22.03.2005, 13:56
Schau dir mal das Tool an
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

Werner_Just
22.03.2005, 14:07
Hallo Sven,



'-------------------------------------------------------------
'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