Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 01. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

Übertragen von Digitalem Wert...

ATMega-Controller in BASIC programmieren

Postby the_one » Tue Nov 24, 2009 12:00 am

Hallo erstmal
Ich habe ein kleines Problem mit der Ausgabe eines Digitalen Wertes.
Anbei habe ich mein Programm hochgeladen mit dem ich Probleme habe ,und zwar habe ich zwei µController mit dem einen lese ich einen Analogen Wert von 0-5Volt ein an Pin PC0 (ATmega8) und wandle ihn in einen Digitalen Wert um. Danach möchte ich ihn übertragen zu dem zweiten µController und ihn natürlich wieder in einen Analogen Wert umformen um ihn danach an PB1 wieder auszugeben . Also mein Sender funktioniert so weit aber der Empfänger hat ein Problem ,weil er gibt irgendwie an ADC0 5 Volt konstant aus ???
Und an PB1 nix ???
Wobei dort eigentlich die Spannung so wie am Eingang 0-5Volt sein sollte...
Bitte um schnelle Hilfe ich bin verzweifelt '
Attachments

[The extension bas has been deactivated and can no longer be displayed.]

the_one
 
Posts: 5
Joined: Fri Jan 03, 2014 1:52 pm

Postby wkrug » Tue Nov 24, 2009 12:00 am

Ich bin jetzt kein BASCOM Anhänger und kann deshalb deinen Quellcode nicht lesen.
Der ATMEGA 88 hat keinen D/A Wandler eingebaut, wohl aber 8 A/D Wandler, wie Du ja schon festgestellt hast.

Um also eine analoge Spannung auszugeben, musst Du einen PWM Generator des ATMEGA nutzen.
Da es anscheinend nur um einen Kanal geht, kannst Du einen Timer im PWM Modus betreibem und an einem Comparematch Ausgang ( z.B. OC1A ) das PWM Signal ausgeben lassen.

Schaltest Du nach der PWM einen geeigneten Tiefpaß, kommt dabei die gewünschte Gleichspannung raus.

Die Höhe der Gleichspannung ist dabei vom Tastverhältnis der PWM abhängig und die wird wiederum über den Wert des Comparematchregisters des benutzten Timers beeinflusst.

Da der ATMEGA 88 nur einen 16 Bit Timer ( Timer 1 ) hat, wirst Du wohl diesen für die Erzeugung der PWM verwenden müssen.

Wenn Dir 8 Bit Auflösung genügen, sind auch Timer 0 oder Timer 2 geeignet.

Bei der Benutzung der PWM solltest Du darauf achten, das der ATMEGA keine "großen" Lasten treiben muß.
Z.B. wenn man LED's direkt an die Pins anschliesst.
Dadurch kommt es Chipintern zu kleinen Spannungsanhebungen, die den PWM Ausgang mit Gleichspannung beaufschlagen, was sich natürlich auf die Ausgangsspannung dieser direkt auswirkt.
wkrug
 
Posts: 443
Joined: Fri Jan 03, 2014 1:47 pm

Postby the_one » Tue Nov 24, 2009 12:00 am

DAnke für die schnelle HIlfe,
also hab in meiner schaltung danach ein RC-Tiefpass geschaltet.
wiederum geht es dann in ein OP das ich 10 V bekomme.
Aber das mit dem Timer im Mega8 hab ich schon das heist ich kann ein Timer1 programmieren und die Pwm auf ein Port und das aber dann mit 100% Pwm anstatt auf zwei Ports a/b. Das Problem ist nur das ich die Digitalen Werte irgendwie nicht in eine veränderbare Pwm bekomme? Weil muss ja davor den Pin (Txd) abfragen oder besser immer abfragen oder wie geht das dann?
Sozusagen

IF Pind.1 = ?? (High)o.(Low) oder?

Then z.B PWM Ausgabe

Das mit der Ausgabe in Pwm blick i scho aber einfach die verarbeitung von PD1 in der Pwm funtzt ned so ganz

wüsstest Du da vielleicht no was passentes ...

Danksche nochmal für die schnelle antwort
the_one
 
Posts: 5
Joined: Fri Jan 03, 2014 1:52 pm

Postby wkrug » Wed Nov 25, 2009 12:00 am

Weil muss ja davor den Pin (Txd) abfragen oder besser immer abfragen oder wie geht das dann?

Ich hab jetzt Deine Frage nicht richtig interpretieren können, versuche aber trotzdem mal zu Antworten.
Wenn die Antwort an der Frage vorbeigeht - sorry.

Du musst ja zu irgendeinem Zeitpunkt das Comparematch Register des Timers 1 mit den Werten für die PWM laden.
Das macht man, abhängig vom PWM Mode, oft im TIMER 1 OFV Interrupt um keine Glitches zu kriegen.
Dieser Timer 1 OVerflow Interrupt wäre auch der geeignete Zeitpunkt um deinen PIND.1 abzufragen und den PWM Wert dementsprechend zu verändern und dann in das Comparematch Register einzutragen.

Somit würde bei jedem neuen PWM Update auch der Zustand des PIN's berücksichtigt.

Dern Wert des Comparematch Registers direkt im Hauptprogramm zu ändern, würde ich nicht tun, weil es dabei zu unerwarteten Reaktionen kommen kann.
Eventuell kannst Du ja die Comparematchwerte für beide Fälle PIND1=0 und PIND1=1 im Hauptprogramm berechnen und diese beiden Werte in einer Variable für die Abholung im TIMER1 OVERFLOW Interrupt bereitstellen.
Tritt dann dieser Interrupt auf wird in der Interruptroutine abhängig vom Zustand des PIND.1 der entsprechende Wert übernommen.
Das käme auch einen schnellen Interruptabarbeitung zugute.
wkrug
 
Posts: 443
Joined: Fri Jan 03, 2014 1:47 pm

Postby the_one » Wed Nov 25, 2009 12:00 am

>Du musst ja zu irgendeinem Zeitpunkt das Comparematch Register des Timers 1 mit den Werten für die PWM laden.

=Ja genau das mit dem einlesen und verarbeiten in einer Pwm klappt nicht...

Hab jetzt mal nur ne Rohe PWM am Ausgang aber die ist natürlich nicht veränderlich, und jetzt müsste ich also ein Interrupt einfügen oder hab ich des richtig verstanden ?

>Dieser Timer 1 OVerflow Interrupt wäre auch der geeignete Zeitpunkt um deinen PIND.1 abzufragen und den PWM Wert dementsprechend zu verändern und dann in das Comparematch Register einzutragen.

=Wie füge ich das Word in ein Register ein von der Pwm ?

Bin da noch Neuling in dem Gebiet habs noch nicht so mit den Befehlen
Und vor allem sind die Beschreibungen alle auf Englisch wäre genial wenn ich da irgendwo ne Seite wüsste wo die Befehle auf Deutsch beschrieben werden, dann hätte ichs bestimmt einfacher.

Gruss Chris
the_one
 
Posts: 5
Joined: Fri Jan 03, 2014 1:52 pm

Postby wkrug » Wed Nov 25, 2009 12:00 am

Ich sa ja, bin kein BASCOM Freak.

Soweit ich weiß, kann man bei BASCOM in der Timer Initialisierung auch gleich eingeben, das ein Interrupt ausgelöst wird.
Dann muß man nur noch eine Interruptroutine schreiben, die in diesem Interrupt ausgeführt wird.

Wie das geht sollte in der BASCOM Hilfe stehen.

Ich denk mal Du benutzt den PWM Ausgang OC1A, dann musst Du das Register OCR1A mit Werten zwischen 0 und 65535 füttern = 0x0000 .... 0xFFFF.
Ich Denke in der Bascom Terminologie heisst das &h0000 .... &hFFFF.

Beim nächsten Durchlauf des Timers sollte dann die gewünschte Pulsbreite ausgegeben werden.

Du kannst es natürlich vorerst auch ohne Interrupt versuchen und das OCR1A Register im Hauptprogramm beschreiben.
Da treten aber dann die unerwünschten Effekte auf.
wkrug
 
Posts: 443
Joined: Fri Jan 03, 2014 1:47 pm

Postby the_one » Tue Dec 01, 2009 12:00 am

'===============================================================================

' ATMEGA88, 11,0592 MHz
' AD > RS232 > Lichtwellenleiter > RS232 > PWM

'===============================================================================

Dim U As Word 'gessener Wert in Digitalzahl umwandeln
Dim D As Byte



'=================Start nach Reset==============================================

$regfile = "m8def.dat"
$baud = 9600
$crystal = 11059200 'Quarz
Open "com1:" For Binary As #1


'===============================================================================
Config Adc = Single , Prescaler = 16 , Refernce = Off 'Pre8...32
Start Adc 'Start Messung


Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down
Start Timer1
Config Portb = Output


Goto Empfaenger
'goto sender




Sender:

Do

D = 27
Put #1 , D
U = Getadc(0)
D = High(u)
Put #1 , D
D = Low(u)
Put #1 , D

Loop




Empfaenger:

Do

Get #1 , D
If D = 27 Then
Get #1 , D
U = D * 256
Get #1 , D
U = U + D
Pwm1a = U

End If

Loop

End

>Also das wäre mein Programm aber irgendwie gibt er die PWM nicht aus hab alles probiert aber irgendwo hab ich da nen denkfehler (((( ich glaube das aus dem Register auslesen funtz ed so wie ichs gerne hätte.
Aber danke nochmal für die schnelle und gut beschriebene Antwort
the_one
 
Posts: 5
Joined: Fri Jan 03, 2014 1:52 pm


Return to BASCOM-AVR-Kurs

Who is online

Users browsing this forum: No registered users and 1 guest