Forum: Mikrocontroller und Digitale Elektronik Mein erstes Programm.funktioniert nicht


von edgar 3. (edgar339)


Lesenswert?

Ich bin Neuling und lerne derzeit Bascom, möchte später aber C lernen.

Nun habe ich mein erstes Programm in Bascom geschrieben, welches bei 
einem ATtiny 2313 (von Pollin) einfach nur den Port D0 aller 500ms an- 
bzw. ausschalten soll, an welchem eine LED hängt. Also ein ganz 
einfacher Blinker.
Nach dem ich das Programm aufgespielt habe(mit PonyProg, nem ATMEL 
Evolution-Board V2.0.1 und USB-Seriell-Wandler), habe ich ihn auf ein 
Steckbrettchen gesteckt und per Netzgerät mit 5V versorgt.
Die LED blinkt nun auch, allerdings zeitlich nicht richtig: sie ist ca. 
5s an und dann ca. ne halbe aus. Dann geht sie wieder an.

Hier ist der Quelltext:

   $crystal = 20000000
   $regfile = "ATtiny2313.dat"
   $hwstack = 12
   $swstack = 8
   $framesize = 8

   Config Portd = Output

   Do
     Portd.0 = 1
     Waitms 500
     Portd.0 = 0
     Waitms 500
   Loop
   End

An den anderen Ports ist nichts zu messen. Ich habe auch schon versucht 
den Port zu ändern und dann wurde auch dieser bedient, nur eben zeitlich 
nicht richtig.
Ich hoffe ich habe alle nötigen Informationen gegeben und danke schon 
mal in Voraus.

: Verschoben durch User
von Thomas D. (thomasderbastler)


Lesenswert?

Hast die Fuse Bits auf externe Quarz gestellt ? Ansonsten läuft mit 
seiner internen Osc.

von edgar 3. (edgar339)


Lesenswert?

Er läuft mit dem internem Quarz. Und der hat laut Pollin 20MHz.

von Eumel (Gast)


Lesenswert?

Taktquelle?

von Eumel (Gast)


Lesenswert?

1. Hat der keinen internen Quarz
2. Läuft ein AVR im Auslieferungszustand mit 1 MHz, 8 MHz interner 
Oszillator und CKDIV8 Fuse.

von edgar 3. (edgar339)


Lesenswert?

Danke an euch alle, ich werde nun einen externen Quarz anstecken.

von Win7fan (Gast)


Lesenswert?

Du hast da wirklich einen 20 MHZ Quarz dran und die Fusebits auf 
externen Quarz umgestellt?  Sieht nicht danach aus, dein Programm 
verhält sich nicht entsprechend deiner Quarz-Vorgabe.

20 MHZ, sind das nicht zuviel für den Prozessor?
Ändere mal die Angabe auf 1000000 ab, falls der Tiny mit den internen 1 
MHZ laufen sollte, passt wenigstens dein Programm.
Wenn es neu übersetzt und eingespielt ist, auf internen Takt steht.

von Eumel (Gast)


Lesenswert?

Edgar Brucke schrieb:
> Danke an euch alle, ich werde nun einen externen Quarz anstecken.

Wieso? Lass ihn erstmal mit dem RC Oszillator laufen. Du sperrst dich 
mit den Fuses eh nur aus.

von edgar 3. (edgar339)


Lesenswert?

Ich benutze jetzt erstmal ein ATMega8, der scheint mir 
anfängerfreundlicher zu seien. Ponyprog schreibt gerade... (oh man sind 
die USB-Seriell Wandler lahm...)

Das mit den Fuses ist mir noch zu hoch, ich werde mich mal ein bisschen 
belesen müssen.

Kennt jemand einen guten Link wo beschrieben wird was diese Befehle tun 
und was da hin muss?

$hwstack
$swstack
$framesize

von Eumel (Gast)


Lesenswert?

Ja, die Basecom hilfe.

von Eumel (Gast)


Lesenswert?

Nur mal kurz am Rande, dir ist klar, dass man mit dieser Zeile
"$crystal = 20000000" Die Taktfrequenz NICHT einstellen kann?

von edgar 3. (edgar339)


Lesenswert?

Ach ja, stimmt ja. Die gerät bei mir immer wieder in Vergessenheit. :)

von edgar 3. (edgar339)


Lesenswert?

>Nur mal kurz am Rande, dir ist klar, dass man mit dieser Zeile
>"$crystal = 20000000" Die Taktfrequenz NICHT einstellen kann?

Ja, soweit ich das verstanden habe ist das eine Info an das Programm wie 
viele Takte eine ms ist.

von Eumel (Gast)


Lesenswert?

Edgar Brucke schrieb:
> Ja, soweit ich das verstanden habe ist das eine Info an das Programm wie
> viele Takte eine ms ist.

Halb richtig, es ist einfach die Takfrequenz deiner Taktquelle. Also 
Takte pro Sekunde. Bascom braucht das, damit so sachen wie "waitms" auch 
die richtige länge haben.

von edgar 3. (edgar339)


Lesenswert?

Ja so meinte ich das auch ^^.

Es läuft jetzt übrigens jetzt (gut, alles ist 8x langsamer als es sein 
sollte aber das liegt an der falschen $crystal Einstellung, da ich 
dachte der läuft schon mit 8MHz...)

Wie ändere ich denn jetzt eigentlich die Taktfrequenz, bzw. wie befehle 
ich dem µC einen externen Quarz zu benutzen?

von Eumel (Gast)


Lesenswert?

Da musst du die Fuses setzen.
Stell $crystal doch einfach richtig ein, im Auslieferungszustand 1000000 
Hz.

von edgar 3. (edgar339)


Lesenswert?

>Da musst du die Fuses setzen.

Gut, das Problem ist nur, dass ich keine Ahnung habe wie ich das machen 
soll.

Sorry das ich so ein nerviger Anfängernoob bin. :/

von Eumel (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/Pony-Prog_Tutorial#Fuses

Da wird dir geholfen.
Google benutzen hilft übrigens ;)

von Thomas D. (thomasderbastler)


Lesenswert?

Edgar Brucke schrieb:
> Kennt jemand einen guten Link wo beschrieben wird was diese Befehle tun
> und was da hin muss?
>
> $hwstack
> $swstack
> $framesize

http://www.halvar.at/elektronik/kleiner_bascom_avr_kurs/speicher_hwstack_swstack_frame/

von edgar 3. (edgar339)


Lesenswert?

Hätte ich als nächstes auch gemacht ^^
Aber eine fachkundige Person ist immer besser :)

Es funktionier jetzt übrigens einwandfrei.
es blinkt wie ich es mir vorstelle. Jetzt kann ich mich an was größeres 
also aus deiner Sicht etwas, was man in 2 Minuten macht. :D
PS: Hast du eigentlich ne eigene Seite?

von Thomas D. (thomasderbastler)


Lesenswert?

Edgar Brucke schrieb:
> PS: Hast du eigentlich ne eigene Seite?

wer ?

von edgar 3. (edgar339)


Lesenswert?

Beide ^^

von Thomas D. (thomasderbastler)


Lesenswert?

Ich nicht..

von Eumel (Gast)


Lesenswert?

Ich kann kein Bascom, aber wenn die LED jetzt blinkt ist doch erstmal 
alles gut.

Nächster Schritt: Signale einlesen. Bis jetzt gibts du ja nur was aus. 
Aber ein "normales" Programm lässt sich ja gut in 3 grobe Schritt 
gliedern:
Eingabe, Verarbeitung, Ausgabe.

von edgar 3. (edgar339)


Lesenswert?

gute Idee, werde ich machen

von Thomas D. (thomasderbastler)


Lesenswert?

Wie Eumel sagt . schalte mal das "geblinke" mit einem Taster ein und mit 
einem anderen aus...danach kannst probieren mit einem Ein und 
Ausschalten.


Schaue mal "If then" an

von edgar 3. (edgar339)


Lesenswert?

Den If befehl kenne ich schon von NetLogo. Aus der Anleitung für das 
Entprellen von Tastern werde ich allerdings nicht ganz schlau...

von Eumel (Gast)


Lesenswert?

Edgar Brucke schrieb:
> Den If befehl kenne ich schon von NetLogo. Aus der Anleitung für das
> Entprellen von Tastern werde ich allerdings nicht ganz schlau...

Mach erstmal was wo das entprellen nicht notwendig ist.
Also: Schalter gedrückt -> LED an
      Schalter nicht gedrückt -> LED aus

Das geht natürlich auch ohne Controller, aber du sollst ja erstmal 
lernen wie man Eingänge einliest :)

von edgar 3. (edgar339)


Lesenswert?

Ach so, ok.

von Eumel (Gast)


Lesenswert?

Das mit dem Prellen ist z.b. wichtig wenn du mit einem Taster einen Wert 
hochzählen willst. Also einmal drücken und der Wert wir erhöht. Der 
Taster prellt allerdings bei drücken und wieder loslassen. Also kann es 
sein, dass du nur einmal drückst aber der Wert um 7 (oder irgendeine 
andere Zahl) erhöht wird. Das will natürlich keiner :)

von edgar 3. (edgar339)


Lesenswert?

Ähhhhm, wie frage ich ab ob eine Spannung anliegt?

Mit "If PortB.0 = 1" ?

von Eumel (Gast)


Lesenswert?

Bei der direkten Syntax kann ich dir nicht helfen.

Erstmal musst die den entsprechenden Pin als eingang konfigurieren, dann 
kannst du das PIN Register auslesen.

von edgar 3. (edgar339)


Lesenswert?

Ach ja, das ging per "case" oder?

von Thomas D. (thomasderbastler)


Lesenswert?

Du kannst Deinen Taster und LED als Alias deklarieren so ist kürzer

'TASTER1 an PB0
Taster Alias Pinb.0
Config Taster = Input
Portb.0=1  / Pullup Einschalten

'LED an PD0
Led Alias pind.0
Config Led = Output

Danach kannst so nehmen

If Taster=1 then
   led=1
   wait 500ms
End if


Oder probiere

If Taster=1 then
   toggle LED
   wait 500ms
End if

von Thomas D. (thomasderbastler)


Lesenswert?

Edgar Brucke schrieb:
> Ach ja, das ging per "case" oder?

Case in diesem Fall bisschen Käse..

Besser wäre ein sog. Debounce Befehl.

von edgar 3. (edgar339)


Lesenswert?

Das ist ja mal schön übersichtlich, im Gegensatz was man so im Inet 
findet!
Ich hab da noch ne Frage: Was ist der Unterschied zwischen PortB.0 und 
PinB.0?

Und wie und warum muss ich den Pullup einschalten?

von Karl H. (kbuchegg)


Lesenswert?

Edgar Brucke schrieb:
> Das ist ja mal schön übersichtlich, im Gegensatz was man so im Inet
> findet!
> Ich hab da noch ne Frage: Was ist der Unterschied zwischen PortB.0 und
> PinB.0?


Spätestens jetzt solltest du dich auch als BASCOM Programmierer ein 
bischen mit den Grundlagen deines µC beschäftigen, welche zb im
AVR-Tutorial
zu finden sind.
Konkret kannst du hier
AVR-Tutorial: IO-Grundlagen
zu Lesen anfangen.

von edgar 3. (edgar339)


Lesenswert?

Warum pullup is jetzt klar, aber wie nicht...

von edgar 3. (edgar339)


Lesenswert?

gut jetzt ist alles klar.

von Thomas D. (thomasderbastler)


Lesenswert?

Studiere die Seite von Halvar.

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.