Forum: Mikrocontroller und Digitale Elektronik [Pollin Atmel-Programmer] Testtoll läuft nicht


von Daniel P. (microcontroller)


Lesenswert?

Hallo liebe Gemeinde,
ich bin noch ein ziemlicher Anfänger zum Thema Microcontroller. Ich habe 
das Pollin-board und einen Atmega32. Als ich das leicht umgeschriebene 
Testtool mit PonyProg auf den µc übertragen habe, hieß es, dass alles in 
Ordnung ist. Alles ich es allerdings getestet habe, ging nur die 
Taster2-LED2 Geschichte. Hier mein Code:
1
 $regfile = "m32def.dat"
2
 $framesize = 32
3
 $swstack = 32
4
 $hwstack = 32
5
 $crystal = 16000000
6
 $baud = 9600
7
8
Dim A As Byte                                               'dimensionieren der verwendeten Variablen
9
Dim B As Byte
10
11
Ddrd = &B11100000                                           'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
12
Portd = &B00000000                                          'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)
13
14
15
Main:                                                       'Hauptprogramm                                                  'Anfang der Schleife
16
17
  If Pind.2 = 1 Then                                        'Wenn an Pin 2 von Port D ein high level anliegt, dann...
18
19
  Toggle Portd.5                                            '...setze Pin 5 von Port D von high auf low oder umgekehrt
20
  Bitwait Pind.2 , Reset                                    'warte bis an Pin 2 von Port D wieder ein low level anliegt
21
22
  End If                                                    'Ende der Bedingung
23
  If Pind.3 = 1 Then                                        'Wenn an Pin 3 von Port D ein high level anliegt, dann...
24
25
  Toggle Portd.6                                            '...setze Pin 6 von Port D von high auf low oder umgekehrt
26
  Bitwait Pind.3 , Reset                                    'warte bis an Pin 3 von Port D wieder ein low level anliegt
27
28
  End If                                                    'Ende der Bedingung
29
  If Pind.4 = 1 Then                                        'Wenn an Pin 2 von Port D ein high level anliegt, dann...
30
31
  Gosub Beep                                                '...gehe zum Untermenü "Beep"
32
  Gosub Textausgabe                                         '...gehe zum Untermenü "Textausgabe"
33
  Bitwait Pind.4 , Reset                                    'warte bis an Pin 4 von Port D wieder ein low level anliegt
34
35
  End If                                                    'Ende der Bendingung
36
37
Gosub Main
38
39
Beep:                                                       'Untermenü "Beep"
40
41
  Portd.7 = 1                                               'setzte den Pin 7 von Port D auf high
42
  Waitms 500                                                'Warte 500 ms
43
  Portd.7 = 0                                               'setzt den Pin 7 von Port D auf low
44
45
Return                                                      'zurück zum Hauptmenü
46
47
Textausgabe:                                                'Untermenü "Textausgabe"
48
49
  Print "Hallo! Du hast Knopf 3 gedrückt."                  'Sende den Text in den Anführungszeichen über RS232 zum PC
50
51
Return
Vielen Dank schon mal für Hilfe
microcontroller

von Daniel P. (microcontroller)


Lesenswert?

Weiß denn wirklich niemand was?

von MWS (Gast)


Lesenswert?

> Weiß denn wirklich niemand was?
Denk' schon, daß die Meisten wissen ;-)
1
Main:                                                       
2
...
3
Gosub Main

ist Krampf, der Code ruft sich rekursiv auf, bis der Stack überläuft. 
Mach statt dem Main: ein Do und statt dem Gosub Main ein Loop rein.

von Daniel P. (microcontroller)


Lesenswert?

Bei loop kommt da folgender Fehler:
Error : 45 Line : 58 DO expected ['] , in File : 
...D810038S\Testtool.bas

von MWS (Gast)


Lesenswert?

> Error : 45 Line : 58 DO expected ['] , in File :

Das könnte dann daran liegen, daß Du das "Do" nicht rein geschrieben 
hast, so wie ich Dir empfahl.

Lies Dir doch mal für die Grundlagen die Bascom Hilfe durch.

von R. F. (rfr)


Lesenswert?

Hallo,

kontrolliere deine Schleifenanweisungen mal auf die Reihenfolge des 
Aufrufes.
Den rekursiven Aufruf von main haben andere beretis erwähnt, aber 
eigentlich sollte da eine Schleife vom Typ Do...While stehen.

Gruss

Robert

von R. F. (rfr)


Lesenswert?

MIFT !!

von Daniel P. (microcontroller)


Lesenswert?

>MIFT !!
Man fragt sich, was das bedeutet. So ein Wort gibt es nicht.

von MWS (Gast)


Lesenswert?

> So ein Wort gibt es nicht.

Genauso wenig wie es:

> eine Schleife vom Typ Do...While

in Bascom gibt  :D  :D  :D

von Daniel P. (microcontroller)


Lesenswert?

MWS schrieb:
>> So ein Wort gibt es nicht.
>
> Genauso wenig wie es:
>
>> eine Schleife vom Typ Do...While
>
> in Bascom gibt  :D  :D  :D

Dein Post.

von MWS (Gast)


Lesenswert?

> Dein Post.

???

Ich glaub' das wird mir zu albern hier...

von Daniel P. (microcontroller)


Lesenswert?

MWS schrieb:
>> Dein Post.
>
> ???
>
> Ich glaub' das wird mir zu albern hier...
Oh, ich entschuldige mich vielmals...
Es liegt eine Verwechslung vor.

von Daniel P. (microcontroller)


Angehängte Dateien:

Lesenswert?

Zurück zum Thema. das funktioniert immer noch nicht. Ich habe im Code 
keine Fehler gefunden. Der komplette Quelltext ist nochmal im Anhang.
Edit: Sry, für das sinnlose Zeug bei PRINT.

von Daniel P. (microcontroller)


Lesenswert?

Mir ist gerade der Gedanke gekommen, dass es evtl. an einer unsauberen 
Lötstelle liegen könnte. Wäre das möglich?

von [/c] (Gast)


Lesenswert?

> Mir ist gerade der Gedanke gekommen, dass es evtl. an einer unsauberen
> Lötstelle liegen könnte. Wäre das möglich?
Klar.
Gibt es auf pollin.de nicht ein Test-Binary? Hast du das mal 
ausprobiert? Du kannst aber auch ruhig noch 5 - 6 Wochen weiter im 
Trüben rumfischen. ;-)

von Daniel P. (microcontroller)


Lesenswert?

Ich benutze das Testtool. Musste nur kleine Änderungen vornehmen, weil 
ich den mega32 habe.

von Stefan B. (fluxflux-sl) (Gast)


Lesenswert?

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
' $crystal = 16000000 ist nur wirksam bei entsprechender
' Fuse-Einstellung und angeschlossenem 16 MHz Quarz!
$crystal = 16000000
$baud = 9600

Ddrd = &B11100000  ' 1=Ausgabe
Portd = &B00000000 ' 0=Ausgabe low bzw. Pull-up Widerstand aus

'Hauptprogramm
DO
  If Pind.2 = 1 Then
    Toggle Portd.5
    Bitwait Pind.2 , Reset
  End If

  If Pind.3 = 1 Then
    Toggle Portd.6
    Bitwait Pind.3 , Reset
  End If

  If Pind.4 = 1 Then
    Gosub Beep
    Gosub Textausgabe
    Bitwait Pind.4 , Reset
  End If
LOOP

'Unterprogramm Beep
Beep:
  Portd.7 = 1
  Waitms 500
  Portd.7 = 0
Return

'Unterprogramm Textausgabe
Textausgabe:
  Print "Hallo! Du hast Knopf 3 gedrückt."
Return

von Daniel P. (microcontroller)


Lesenswert?

Jetzt macht der Apparillo gar nichts mehr. Kummonikation funktioniert 
noch. Fuse bits hab ich so wie in der Anleitung.

von Stefan B. (Gast)


Lesenswert?

Taster: JP3, JP4 und JP5 sind gesteckt?
LED: JP6, JP7 sind gesteckt?

Backe zunächst ein kleineres Brötchen.
Beobachte das Board: Wie oft blinkt dieses Programm in 16 Sekunden:

$regfile = "m32def.dat"
$crystal = 16000000

Ddrd = &B11100000  ' 1=Ausgabe
Portd = &B00000000 ' 0=Ausgabe low bzw. Pull-up Widerstand aus

'Hauptprogramm
DO
  Gosub Beep
LOOP

'Unterprogramm Beep
Beep:
  Portd.7 = 1
  Waitms 500
  Portd.7 = 0
  Waitms 500
Return

von Daniel P. (microcontroller)


Lesenswert?

Beim ersten Versuch 2-mal. Beim 2., 3., 4., ... gar nicht.

von Stefan B. (Gast)


Lesenswert?

Das ist ein gutes Ergebnis, weil es zeigt: Dein AVR läuft nicht mit 16 
MHz.

Wahrscheinlich läuft er noch mit dem internen RC-Oszillator mit 1 MHz, 
d.h. in der Werkseinstellung.

Wenn du das ändern willst, musst du dich mit dem Datenblatt und dem 
Artikel AVR Fuses befassen.

Tipp: Bevor du dann die Fuses umprogrammierst, komme wieder her und hole 
dir Meinungen deinem Vorhaben ab.

von Stefan B. (Gast)


Lesenswert?

Moment... von welcher LED reden wir hier? Sch***se, wenn der 
Fragesteller keinen Schaltplan mitliefert und man selbst zu strack zum 
Nachschlagen ist. Auf dem Pollinboard ist Portd.7 doch die Ansteuerung 
für den Summer! Das hätte tröten müssen.

Jedenfalls ist eine leuchtende/zuckende LED mit obigem Programm sehr 
komisch! Welche LED war's - NetzLED oder LED1 oder LED2? Zucken der 
Netz-LED könnte auf Überlastung hindeuten. Wird der 7805 richtig warm 
(nicht mehr anfassbar)? Zucken einer der anderen LEDs könnten 
Lötprobleme sein.

Nochmal testen! Jetzt mit dem richtigen Anschluss für eine LED (LED2):

$regfile = "m32def.dat"
$crystal = 16000000

Ddrd = &B11100000  ' 1=Ausgabe
Portd = &B00000000 ' 0=Ausgabe low bzw. Pull-up Widerstand aus

'Hauptprogramm
DO
  Gosub Beep
LOOP

'Unterprogramm Beep
Beep:
  Portd.6 = 1 ' <==== GEÄNDERT!
  Waitms 500
  Portd.6 = 0 ' <==== GEÄNDERT!
  Waitms 500
Return

Datenblatt
http://www.pollin.de/shop/downloads/D810038B.PDF

von Stefan B. (Gast)


Lesenswert?

Wenn es nicht getrötet hat, dann keine Sorgen machen!

In Pollin ATMEL Evaluations-Board steht:

"Summer. Es scheint verschiedene Bestückungen zu geben. Selbstständig 
schwingend oder simpel. Achtung! Zumindest eine Sorte "Summer" ist ein 
Lautsprecher mit 50 Ohm. Anstatt des Jumpers eine LED aufstecken 
vermindert die Belastung des Prozessors erheblich, und man hat zugleich 
eine optische Kontrolle."

Wenn dieser sog. AC-Summer ein simpeler Piezosummer ist, muss der viel 
viel schneller als mit 500ms Halpperiodezeit abgesteuert werden. Die 
Resonanzfrequenz liegt so in der Gegend von 2-3 KHz, d.h. Wartephasen 
von 1 bis 2ms sind da nötig, um richtig Sound rauszubekommen. Das sollte 
man erst in Angriff nehmen, wenn die Sache mit dem $crystal=... geklärt 
ist.

von Stefan B. (Gast)


Lesenswert?

s/Halpperiodezeit/Halbperiodezeit/

von Daniel P. (microcontroller)


Lesenswert?

Mi dem alten Programm hat sich jetzt was geändert: Das tickt ähnl. 
Metronom. Das neue probiere ich gerade aus.

von Daniel P. (microcontroller)


Lesenswert?

Ok, es tickt exakt im 1/2-Sekunden-Takt.
>wenn die Sache mit dem $crystal=...
Wie bereits geschrieben, bin ich Anfänger. Aber ein mega32 hat doch 
16MHz, oder?

von Stefan B. (Gast)


Lesenswert?

Ein Atmega32 kann - laut Atmel Spezifikation im Datenblatt - mit bis 
zu 16 MHz getaktet werden, wenn eine externe 16MHz Taktquelle 
angeschlossen ist und diese Taktquelle per AVR Fuses eingestellt 
ist.

von Daniel P. (microcontroller)


Lesenswert?

Stefan B. schrieb:
> Ein Atmega32 kann - laut Atmel Spezifikation im Datenblatt - mit bis
> zu 16 MHz getaktet werden, wenn eine externe 16MHz Taktquelle
> angeschlossen ist und diese Taktquelle per AVR Fuses eingestellt
> ist.
Ich hab ger keine externe Taktquelle angeschlossen. Wären also die 
vorgegebenen 8MHz richtig?

von [/c] (Gast)


Lesenswert?

Daniel P. schrieb:
> Stefan B. schrieb:
>> Ein Atmega32 kann - laut Atmel Spezifikation im Datenblatt - mit bis
>> zu 16 MHz getaktet werden, wenn eine externe 16MHz Taktquelle
>> angeschlossen ist und diese Taktquelle per AVR Fuses eingestellt
>> ist.
> Ich hab ger keine externe Taktquelle angeschlossen. Wären also die
> vorgegebenen 8MHz richtig?
Nein, wenn du die Fuses nicht angefasst hast, hat er 1MHz intern. Die 
drei Links unten liest du bitte mal durch, oder du schickst jemanden Das 
Board zu und lässt den gleich deine ganze Arbeit machen. ;-)

http://www.mikrocontroller.net/articles/AVR_Fuses
http://www.wiki.elektronik-projekt.de/mikrocontroller/avr/fusebit_tutorial
http://www.engbedded.com/fusecalc/

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.