Ik heb 8 schuifpotentiometers aangesloten op de adc ingangen van mijn ucontroller en ik heb 8 leds aangesloten op portd van mijn atmega16. Nu is het de bedoeling dat als de potentiometer helemaal openstaat de led fel brandt en deze zacht dimt tot hij helemaal dicht staat en de led volledig uit is. Dus ik heb 8 verschillende kanalen met elk een led.
Nu heb ik een programma in bascom geschreven maar het eerste gedeelte flikkeren de leds toch, terwijl deze uit zouden moeten zijn. De leds zijn actief laag.
Hieronder staat mijn programma misschien kan iemand mij helpen ik zit een beetje vast.
Ik gebruik dus geen pwm kanaal omdat ik er maar 4 ter beschikking heb en er 8 nodig had.


$regfile = "M16def.dat"

Config Portd = Output
Config Timer0 = Timer , Prescale = 256
Enable Interrupts
Enable Timer0
On Timer0 Resetten
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Adc_waarde As Word
Dim Kanaal(8) As Byte
Dim I As Byte
Dim I2 As Byte





Do
   Gosub Inlezen
   For I = 1 To 8
      If Timer0 > Kanaal(i) Then
         I2 = I - 1
         Portd.i2 = 1
      End If
   Next I
Loop
End

Inlezen:                                                    ' kanalen inlezen via adc

   For I = 1 To 8
      I2 = I - 1
      Adc_waarde = Getadc(i2)
      Shift Adc_waarde , Right , 2
      Kanaal(i) = Low(adc_waarde)
   Next I
Return

Resetten:
Portd = 0


Return

Groeten

En wat doen de led's bij volledige uitsturing? De waarde die op het ADC binnenkomt is nooit helemaal nul.

De leds worden heel snel geschakeld en slechts kort uitgschakeld waardoor het lijkt dat ze vrij helder branden. ADC waarde is wel volledig 0 als de potentiometer dicht staat.

Je timer0 begint niet op nul bij de volgende DO LOOP, hierdoor weet je nooit welke waarde hij heeft als je aan een nieuwe cyclus gaat beginnen.
En volgens mij mag je hier Portd.i2 = 1 geen variabele gebruiken, maar dat weet ik niet helemaal zeker.
Ondanks dat bascom het compiled zonder error's hoeft niet te zeggen dat het altijd goed is.

Edit: En je timer0 blijft lopen, hierdoor blijft er een interrupt komen, ook als je schuiven dicht staan.In je interrupt schakel je de leds weer aan om ze dan in je hoofdroutine gelijk weer uit te schakelen, maar dit zie je wel aan je leds.

[Bericht gewijzigd door 2N3055 op (26%)]

Op welke frequentie loopt het ding? Ik mis nog een $Crystal statement bovenaan.

Met 4MHz en een prescaler van 256 kan je al een 60Hz 8bits PWM signaal maken, in de timer. Dus mijn vraag, waarom zet je de PWM routine niet in de timer, waar ie hoort? Elke cyclus een variabele ophogen en vergelijken met de waarde van de ADC. De AD waardes kan je dan een keer in de zoveel tijd opvragen in de main.

De atmel staat geprogrammeerd intern op 8Mhz. Hoe bedoel je om de pwm routine in de timer te zetten.

Alvast bedankt