www.mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Micky (Gast)
Datum:

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

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
Loadwordadr Sine
!MOVW    XL,     ZL
!CLR     R17
!CLR     R18
!start_loop:
!LPM     R16,    Z
!OUT     PortD,  R16
!INC     R17
!MOVW    ZL,     XL
!ADD     ZL,     R17
!ADC     ZH,     R18
!RJMP    start_loop
Code ist nicht getestet.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
Loadadr A(1) , Z
!MOVW    XL,     ZL
!CLR     R17
!start_loop:
!LD      R16,    Z+
!OUT     PortD,  R16
!INC     R17
!BRNE    not_zero
!MOVW    ZL,     XL
!not_zero:
!RJMP    start_loop

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

Bewertung
0 lesenswert
nicht 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.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du dich in DDS einarbeiten willst, da habe ich gerade vor kurzem 
ein Buch gesehen:
http://www.buecherbillig.de/advanced_search_result...
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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.