Forum: Mikrocontroller und Digitale Elektronik Bascom PWM TOP-Value


von jogi (Gast)


Lesenswert?

Aus der Bascom-Doku werd ich nicht schlau......

Allerdings steht im Datenblatt des ATmega8, das man bei bestimmten 
PWM-Modi einen TOP-Value setzen kann (bei Timer1).
Geht das auch in Bascom? Muss ich dazu Assembler einbinden?  - habe 
hierzu leider nirgens was gefunden.

Hintergrund:

Ich möchte am OC1a ein Rechtecksignal ca 27kHz, Tastverhältnis 1:8 
erzeugen können
Die Frequenz soll möglichst exakt eingestellt (und auch verstellt) 
werden können.

(Momentan mache ich das ganze im Timer-Modus, wobei ich die Low-Zeit mit 
Timer1 und die High-Zeit mit Pulseout festlege - ziemlich ungenau)

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Je nach Timer-Modus steht der TOP-Value in unterschiedlichen Registern.
Das kann OC1A aber auch ICR1 sein...

Du brauchst also eine Periodendauer von ca. 37µs. Die sollte man im 
CTC-Modus (Seite 86 im Datenblatt) erzeugen können bei entsprechend 
hoher Taktfrequenz.
Das Tastverhältnis kann man dann durch OC1B einstellen.

von jogi (Gast)


Lesenswert?

und geht das in Bascom-Basic?

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>und geht das in Bascom-Basic?

Weiß ich nicht. Entweder kann man in Bascom den Timer komplett manuell 
einstellen können, oder es gibt einen entsprechenden "Bauklotz".

von jogi (Gast)


Lesenswert?

hmmm, dann befürchte ich, ich werde an Assembler nicht vorbeikommen - 
oder muss zumindest die register von hand setzen.

Merci für die hilfe.

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Eigentlich sollte sowas auch in Bascom möglich sein.
Ein anderer Weg wäre es, C zu lernen.
(Für den Vorschlag hab ich schon so oft einen auf die Mütze bekommen...)
Allerdings stellst du ja gerade selber fest, dass Bascom seine Grenzen 
hat (die man in C nicht hat...).

von Gerhard (Gast)


Lesenswert?

Da sind die Grenzen von Bascom noch lange nicht in Sicht.
Du kannst in Bascom auf alle Register direkt
zugreifen.

Bei Timer1 sieht das z.B. so aus

Tccr1a = &B11110010
Tccr1b = &B00011000
Icr1h = 0
Icr1l = 100
Capture1 = 100
Compare1a = 80
Compare1b = 20


oder eben ASM einbinden
 z.B.

$asm
ldi r18,&b11110010
Out Tccr1a , R18
ldi r18,&b00011010
Out Tccr1b , R18
$end Asm

Gruss Gerhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.