PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit ATMega32 und PWM und LCD



DO7PNP
19.05.2008, 17:05
Hallo zusammen,

ich arbeite noch nicht so lange mit µC's, also kann es sein, das es ganz einfache Fragen sind.
Google etc. wirft für mich auch keine brauchbaren Antworten aus. Aber das RN-Wissen war zum Teil ganz hilfreich.

Ich wollte mit PWM eine LED heller und dunkler leuchten lassen. Da passiert aber garnichts! Ich glaube da fehlt noch eine Definierung zwischen dem PWM und dem Port. Hier mal der Code:

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb.1 = Output
Config Portb.2 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Do
Compare1a = 205
Compare1b = 51

Loop

End

Also die LEDs an Port B1 und B2 soll jeweils unterschiedlich hell leuchten.

2. Frage:
Wenn ich das richtig verstanden habe, schaltet der Chip immer zwischen +5V und 0V um. Aber die Leds sind doch nur für 3V ausgelegt. Oder entsteht da eine abgerundete Sinuswelle? Bei 5V würden die doch kaputt gehen.

3. Frage:
Ich habe ein 4*20 Zeichen LCD. Das lässt sich auch wunderbar im Bit Modus ansteuern. Aber nach dem Letzten Buchstaben oder Zeichen kommt immer so ein _ (Unterstrich). Wie kann ich den unterdrücken/verhindern?

Danke schonmal im voraus

linux_80
19.05.2008, 17:57
Hi,

zum PWM: Die OC-Ausgänge von Timer 1 sind bei PortD4 und 5.

2. Ohne Vorwiderstand darf man die LED nicht betreiben, sonst brennt die nur einmal, hier ausrechnen:
http://www.elektronik-kompendium.de/sites/bau/1109111.htm

3. Das wird der Cursor sein, einfach abschalten, siehe Bascomhilfe.

DO7PNP
19.05.2008, 21:33
Das mit dem Cursor habe ich hinbekommen. Danke
-> Cursor off

Aber ich dachte, man kann mit PWM auch Spannungen zwischen 0 und 5 V erzeugen. Dann wird die Helligkeit der LED ja nicht wirklich verändert, sondern dem Auge etwas vorgegaukelt!
Wie kann ich denn zum Beispiel eine (fast) saubere Sinus-Wechselspannung erzeugen?
Kann ich die PWM von PortD.4 und PortD.5 auch auf andere Ports "umlegen"? Oder mehrere Timer für andere Ports verwenden?

Danke schonmal im voraus

linux_80
19.05.2008, 21:51
Die OC-Ausgänge sind fest, jeder Timer hat seine eigenen.

Das mit dem vorgaukel ist richtig, ist ja auch Sinn der Sache, LEDs wollen das auch nur so, nur 0 oder 1 !

Wenn das Rechtecksignal kurvig werden soll, muss man aussen mit Kondensatoren experimentieren, bzw. die die sich damit auskennen, berechnen ;-)
Ob man einen Sinus hinbekommt bin ich mir aber nicht sicher.
Wechselspannung geht so garnicht, da brauchts etwas mehr an Beschaltung, siehe zB. Motortreiber (H-Brücke).

DO7PNP
20.05.2008, 15:24
Und wie sieht es mit mit D/A Wandlern aus? Davon besitzt der ATmega32 doch welche, oder? Die müssten doch Sinusförmige Spnnungen erzeugen können, wenn auch nur im positiven bereich!?

linux_80
20.05.2008, 16:03
Sorry, diese Richtung kann der AVR nicht, nur A->D.
Man kann nur das PWM nutzen um D/A zu bekommen, dazu muss man aber selber extern beschalten. Mit Sinus schauts trotzdem nicht ganz so gut aus, bzw. wenns ganz langsam geht, und man die Werte ständig ändert, könnte das in die Rubrik Sinus fallen :-k
Aber dazu sollte man bei den Elektr(on)ikern anfragen.

DO7PNP
20.05.2008, 20:33
Ok, Danke.

Jetzt habe ich Im RN-Wissen nach ADC gesucht, gefunden und abgewandelt übernommen, weil ich noch kein Kable zur RS232 habe sondern nur ein Display.
Der ATmega32 soll nach folgendem Code die Spannung an allen PortA bzw. nur an PortA.0 auslesen und im Display mit dazugehöriger Pinnummer anzeigen. Klappt soweit auch fast alles, nur habe ich mit offenem Ende an PortA.0 (nicht mal ein Kabel ist angechlossen) einen Wert von 1 Volt! Und bei der Versorgungsspannung bloß 4Volt anstatt 5V. Aber er wird mit 5V versorgt (sogar nachgemessen!). Woran liegt das? Bis wieviel Volt kann der ATmega32 messen?
Den Wert von den Ports habe ich natürlich umgewandelt nach RN-Wissen.

regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portc.5 = Output 'Híntergrundbeleuchtung
Config Portd.6 = Output 'Gruen LED

'LCD Eigenschaften...
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4 , E = Portc.0 , Rs = Portd.7
Config Lcdbus = 4

Portc.5 = 1 'Hintergrundbeleuchting ein
Portd.6 = 1 'Gruen LED ein
Cursor Off 'Cursor ausschalten
Cls 'Display löschen

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0



Do
W = Getadc(channel) 'Wert am Port auslesen
W = W * 5 'Wert * Interne Referenzspannung (5V)
W = W / 1024 'Wert / 1024 oder Wert / 2^10
Locate 2 , 1 'Wert ausgeben mit Pinangabe
Lcd "ADC-Pin: "
Locate 2 , 10
Lcd Channel
Locate 3 , 1
Lcd "Wert: "
Locate 3 , 10
Lcd W ; " Volt"



'Incr Channel 'Damit nur PortA.0 angezeigt wird
If Channel > 7 Then Channel = 0 'Im Moment überflüssig
Waitms 500
Loop

End

So gibt es ja keine zuverlässige Angabe. Warum werden nur ganzzahlige Werte angezeigt?

Robin1508
20.05.2008, 20:40
Also wenn man am ADC nichts anschließt, ihn aber trotzdem Aktiviert, kommen immer solche Werte raus. Weis nich wieso, aber das wurde mir am Anfang auch mal gesagt. Die Messergebnisse stimmen dann schon, sobald du was "richtiges" anschließt.

Der Atmega32 kann ohne Hilfsmittel bis 5 Volt Messen, alles darüber kann den Port bzw. den ganzen Atmega beschädigen. Willst du trotzdem höhere Spannungen messen, musst du vor den ADC einen Spannungsteiler (zwei Widerstände in Reihe) schalten, sodass am ADC eben nur maximal(!) 5V rauskommen. Dann kannst du per Software hochrechnen, wieviel Volt du vor dem Spannungsteiler (Ohmsches Gesetz) hast.

Gruß, Robin