Forum: Mikrocontroller und Digitale Elektronik Eine kleine Frage zur Programmierung


von Dr. Janitor (Gast)


Lesenswert?

Hallo Leute,

Da ich ja, dank euch, endlich mit meinem Atmel Evaluationboard 2.0.1 
meinen ATtiny2313 programmieren kann, habe ich schon einige Projekte 
einfachster Natur realisiert, dazu zählen beispielsweise, blinkende 
Dioden etc.

Nun habe ich aber eine Frage:

Das Blinken habe ich folgendermaßen Realisiert:
1
Ddrb = &B00010000
2
3
  Do
4
    Portb.4 = 1
5
    Waitms 200
6
    Portb.4 = 0
7
    Waitms 200
8
  Loop
9
End


Nun geht das aber nur bis man
1
Waitms
 auf 1ms stellt.

Wenn ich jetzt aber Beispielsweise ein Signal mit 20.000 Hz erzeugen 
möchte, wie kann ich das realisieren?

Ich hatte an
1
PULSEOUT
 gedacht, aber da kann ich ja nur die Pulslänge bestimmen, nicht die 
Pausendauer. Da war meine Überlegung halt: Wenn ich da einen Puls 
passender Länge einstelle, ist die Pause ja quasi fast 0, eben nur so 
lange bis das Programm wieder an der Pulse Zeile ist.

Hat zu dem Problem jemand eine Lösung?

MfG

Dr. Janitor

von Lord Z. (lordziu)


Lesenswert?

Guckst du hier AVR-Tutorial: Timer. Allerdings weiß ich nicht, wie 
man das in Bascom macht.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Oder bis zu 1000x feinere Auflösung nehmen: WAITUS
http://avrhelp.mcselec.com/waitus.htm

von Michael R. (dj_motionx)


Lesenswert?

Würde dir auch empfehlen dich in die timer einzulesen.
Also
1. Leds initialisieren.
2. Timer Konfigurieren und starten.
3. Auf Timer IR wearten und die Leds toggeln.

L.g Viel Spaß und Erfolg

von Dr. Janitor (Gast)


Lesenswert?

Oh es gibt auch feinere Auflösungen?!

Uuups.

Das wusst ich nicht. Das versuche ich als erstes. Und ich lese mich dann 
mal in das Tutorial durch.

Danke euch vielmals

Problem ist eigentlich damit schon gelöst.

von Dr. Janitor (Gast)


Lesenswert?

Hi Leute, ich habe meine Schaltung nun ein wenig verbessert.

Folgenden BASCOM Code Benutze ich:
1
Dim Puls1 As Word
2
Dim Puls2 As Word
3
4
Ddrb = &B00010000
5
Portb.1 = 1
6
Portb.2 = 1
7
Portb.3 = 1
8
9
10
Puls1 = 0
11
12
   If Pinb.1 = 1 Then
13
14
       Puls1 = Puls1 + 1
15
       Waitms 200
16
   End If
17
18
19
   If Pinb.2 = 1 Then
20
21
       Puls1 = Puls1 - 1
22
       Waitms 200
23
   End If
24
25
26
   If Pinb.3 = 1 Then
27
28
       Puls1 = 0
29
       Puls2 = 20
30
       Waitms 200
31
   End If
32
33
34
Puls2 = 20 + Puls1
35
36
37
  Do
38
39
    Portb.4 = 1
40
    Waitus Puls2
41
    Portb.4 = 0
42
    Waitus Puls2
43
44
  Loop
45
End

Folgendes Soll die Schaltung machen. Ich will ein Signal bestimmter 
Frequenz an PIN 4 erzeugen und mit Tastern an PIN 1 und 2 die Frequenz 
verändern.

Ich hatte bis dato keine Zeit / Möglichkeit die Schaltung genaueren 
Tests zu unterziehen, daher wollte ich fragen: Funktioniert der Code so?

von Karl H. (kbuchegg)


Lesenswert?

Ich kann nicht so recht erkennen, wie du in der innersten (und einzigen) 
do-Loop Schleife jemals eine Tasterabrage machen willst.

von Dr. Janitor (Gast)


Lesenswert?

Aua, böser Fehler.

Ich glaub die If Then Anfragen müssen in den LOOP ?

von Karl H. (kbuchegg)


Lesenswert?

Dr. Janitor schrieb:
> Aua, böser Fehler.
>
> Ich glaub die If Then Anfragen müssen in den LOOP ?

Dann wird aber dein Timing nicht mehr stimmen :-)


-> Wenn du exaktes Timing brauchst, ist Wait ein völlig ungeeignetes 
Instrument. Du brauchst einen Timer, der das Pintoggeln in Hardware 
macht.

von Klaus (Gast)


Lesenswert?

Guter Rat: Guck weiter Scrubs anstatt zu programmieren. Is besser!

von Dr. Janitor (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Dann wird aber dein Timing nicht mehr stimmen :-)

Aber doch nur zu der Zeit, zu der der Taster gedrückt wird oder? Danach 
läuft das ganze doch mit dem "Normalen" Takt weiter.

Aber ich werd mir jetzt mal das Timer Tutorial ankucken...

Klaus schrieb:
> Guter Rat: Guck weiter Scrubs anstatt zu programmieren. Is besser!

1. Woher weisst du, dass ich Scrubs gekuckt habe,
2. Das war unnötig.

MfG

von Klaus (Gast)


Lesenswert?

Dr. Janitor schrieb:
> 1. Woher weisst du, dass ich Scrubs gekuckt habe,
> 2. Das war unnötig.

1:  Das seh ich an deinem Namen :-)

2: Schuldigung :) Nimms bitte nicht ernst, ich wollt nur den Spruch mit 
Scrubs loswerden ;)

von Dr. Janitor (Gast)


Lesenswert?

Ah ist was dran :D

hab ja garnicht mehr an meinen Namen gedacht.

Gibt ehrlich wenige denen das auffällt.

mfg

von Klaus (Gast)


Lesenswert?

Dr. Janitor schrieb:
> Aber doch nur zu der Zeit, zu der der Taster gedrückt wird oder? Danach
> läuft das ganze doch mit dem "Normalen" Takt weiter.

Naja, nicht ganz. Denn die Abfrage an sich braucht auch ein wenig Zeit. 
In deinem Fall aber wohl vernachlässigbar wenig. Trotzdem ist ein Timer 
das Mittel der Wahl, denn das ist der Schlüssel dazu, dass dein uC 
nachher mal viele Sachen gleichzeitig machen kann.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

> Trotzdem ist ein Timer
> das Mittel der Wahl, denn das ist der Schlüssel dazu, dass dein uC
> nachher mal viele Sachen gleichzeitig machen kann.

Deshalb hänge ich mal ein Bascom-Programm für den Tiny13 an, bei dem der 
Timer genutzt wird. Es ist eine kleine Spielerei, die eine Seilbahn 
(oder einen Wendezug) mit einstellbarer Geschwindigkeit (Poti am ADC) 
zwischen zwei Tastern (Reed-Kontakten) hinundherfahren lässt.

Nur mal so zum Analysieren und schaun, wie man in Bascom den kleinen 
Tiny13 programmieren kann. Es zeigt auch, dass es oftmals (laufzeitmäßig 
gesehen) günstiger ist, auf Bascom-Befehle zu verzichten und den Job zu 
Fuß zu machen (siehe Tastenabfrage, ADC-Auslesen). Das Programm zeigt 
auch, wie man eine Software-PWM mit variablen Tastgrad realisiert und 
die Mainloop auf den Timer synchronisiert (was Warteschleifen 
überflüssig macht).

Es soll aber auch ein kleiner Wink mit dem Zaunpfahl sein, was das 
Kommentieren des Programmcodes betrifft.

Ich hoffe, dass das unserem "promovierten Hausmeister" ein Stück weiter 
hilft...
;-)

...

von Dr. Janitor (Gast)


Lesenswert?

Ich denke ihr habt recht.

Ich wollte mich gestern schon in den Timer einlesen, kam aber nicht mehr 
dazu. Ich hoffe das ich heute Abend dazu zeit finde. Es ist denke ich 
die Sinnvollste Methode.

Melde mich sobald ich weiter bin. Musste heute erstmal ein Paar 
besorgungen für die Schaltung machen ( mir ging der Saft aus )...

Mfg

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.