Forum: Mikrocontroller und Digitale Elektronik Assembler in BASCOM / ATMega88 Funktionsgenerator


von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,
bin neu hier im Forum und arbeite mich hobbymässig in die Programmierung 
der ATMega88 ein.
Ich habe zwar mal E-Technik/Elektronik studiert (Dipl.Ing.), ist aber 
schon über 30 Jahre her und habe eigentlich immer im kaufmännischen 
gearbeitet.
Daher bin ich nicht mehr so besonders firm in der aktuellen Technik.
Als Rentner beschäftige mich mit jetzt zum ersten mal mit 
Microprozessoren.

Jetzt zum Thema:
Ich habe mit einem ATMega88-20 (8 MHz interner Takt) einen digitalen 
Funktiongenerator auf einem Steckbrett erstellt.
Über den Port D gebe ich die Werte einer Sinus-Tabelle auf ein R/2R 
Widerstandsnetzwerk aus (als D/A-Ersatz).
Das funktioniert auch wunderbar - siehe auch die Dateianhänge.
Aber:
Da alles in BASCOM-Basic programmiert ist, komme ich mit meiner 
Sinusfrequenz nicht über 1 kHz hinaus.
Daher wollte ich die zeitbestimmende Schleife, also der While-Wend Teil, 
mit Inline-Assembler beschleunigen (kompl. Programm im Dateianhang).

Do
  While I < C
    Incr I
    Portd = A(i)
  Wend
  I = 0
Loop

Falls sich einer wundert warum ich eine While-Wend Schleife benutzt habe 
- die war etwas schneller als ein For-Next Konstrukt.

Da Assembler für mich böhmische Dörfer sind, eine Bitte:
Vieleicht kann mir jemand da auf die Sprünge helfen ?

Das Ganze möchte ich mit weiteren Funktionen zu einem kompletten 
einfachen Funktionsgenerator für Testzwecke ausbauen.

Gruss Albert

von Micky (Gast)


Lesenswert?

Hier 
http://www.rn-wissen.de/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User 
gibt es eine Einführung.
Ich bin zwar eher der C/ASM Fan aber der Text scheint mir recht gut 
geschrieben zu sein.

von MWS (Gast)


Lesenswert?

Das hier sollte mit 10 Zyklen auf 800kHz kommen. Würden die Sinus-Werte 
aus dem SRam gelesen, wären's nur 2 Zyklen weniger. Man kann's sicher 
auch anders schreiben, aber so ist's automatisch glitch-free.
1
Loadwordadr Sine
2
!MOVW    XL,     ZL
3
!CLR     R17
4
!CLR     R18
5
!start_loop:
6
!LPM     R16,    Z
7
!OUT     PortD,  R16
8
!INC     R17
9
!MOVW    ZL,     XL
10
!ADD     ZL,     R17
11
!ADC     ZH,     R18
12
!RJMP    start_loop
Code ist nicht getestet.

von MWS (Gast)


Lesenswert?

MWS schrieb:
> Code ist nicht getestet.

Code funktioniert und braucht 10 Zyklen.

Das hier:
> auf 800kHz kommen.

war natürlich ein Schmarrn, das ist die Durchlaufgeschwindigkeit der 
Routine, entspricht natürlich nicht der Frequenz des Sinus.

Nachfolgender Code macht's glitch-free in 8 Zyklen, 8MHz div 8 div 256 = 
3906Hz, das sollte das höchste der Gefühle mit 256 Stufen Auflösung 
sein. Ein bisserl wenig für einen Funktionsgenerator.
Außerdem wäre die Frequenzeinstellung schon sehr grob, denn ein NOP 
dazu, also ein Zyklus mehr ergibt nur noch 3472Hz.

Weniger Stützpunkte ergeben eine höhere Frequenz, zum Thema gibt's unter 
dem Stichwort "DDS" ausreichend Information.
1
Loadadr A(1) , Z
2
!MOVW    XL,     ZL
3
!CLR     R17
4
!start_loop:
5
!LD      R16,    Z+
6
!OUT     PortD,  R16
7
!INC     R17
8
!BRNE    not_zero
9
!MOVW    ZL,     XL
10
!not_zero:
11
!RJMP    start_loop

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

Danke für eure hilfreichen Antworen, das bringt mich schon mal weiter.
Ich werde mich wohl doch mal in Assembler einarbeiten.
Wahrscheinlich ist mein Ansatz aber wegen der relativ niedrigen 
möglichen Ausgangsfrequenz trotz Inline-Assembler wohl doch nicht der 
richtige.
Werde mir daher mal die DDS Threads ansehen.

von U.R. Schmitt (Gast)


Lesenswert?

Wenn Du dich in DDS einarbeiten willst, da habe ich gerade vor kurzem 
ein Buch gesehen:
http://www.buecherbillig.de/advanced_search_result.php?keywords=dds
Ich hatte es aber nur kurz in der Hand insofern kann ich Dir nichts zur 
Qualität sagen, aber der Preis ist evt. ein Versuch wert.

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

@MWS
Deinen Assemblercode habe ich als Inlin-Assembler in Bascom eingefügt.
Funktioniert prima und ergibt 4 kHz was Deine Rechnung bestätigt.

@U.R. Schmitt
Das DDS Buch hab ich mal bestellt. Für 4,95 Euro kann man ja nicht viel 
falsch machen.

von eProfi (Gast)


Lesenswert?

DER Klassiker ist Jespers Poor Man's DDS.


Andreas, der Betreiber von µC.net ("Hausherr"), hat seine Facharbeit zum 
Thema geschrieben.
siehe Artikel digitaler Funktionsgenerator
http://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator

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.