Forum: Mikrocontroller und Digitale Elektronik Fehler Behebung in Bascom


von manuche (Gast)


Lesenswert?

Hallo,
ich möchte für meinen Bruder mit BASCOM ein Programm schreiben.
Dabei ist folgendes Problem aufgetaucht und ich weiss wirklich nicht wie 
ich ihn beheben kann da ich BASCOM Newbie bin:
Während eines Interrupts habe ich eine Case-Abfrage eingebaut. Wenn ich 
die Syntax überprüfe dann taucht bei jeder einzelnen Case-Entscheidung 
der Fehler mit dem Fehlercode 31 (Invalid data type) mit dem Pfad meines 
Programms. Weiss jemand was mir das jetzt sagen soll bzw wie ich das 
behebe?
Gruß manuche

von Bernd T. (bastelmensch)


Lesenswert?

Entweder stellst Du den Code hier rein damit man es anschauen kann, oder 
Du hast Glück und mein Tipp hilft Dir:

Schau Dir an ob Deine Dimensionierungen zu den Variablen passen.

von manuche (Gast)


Lesenswert?

$regfile = "2313def.dat"
$crystal = 3686400

Ddrb = &B11111111
Ddrd = &B1110000

On Int0 Taste
Config Int0 = Rising
Enable Int0
Enable Interrupts

Dim Z As Integer
Const Granted As String
  Granted = Access Granted
Const Denied As String
  Denied = Access Denied
Dim Zahl1 As Boolean
Dim Zahl2 As Boolean
Dim Zahl3 As Boolean
Dim Zaehler As Integer
  Zaehler = 0
Dim Gueltig As Boolean
  Gueltig = 1
'Code: Z = 3, Z = 4, Z = 5

Z = 15

Do

  Select Case Z
    Case 0 To 13 : Portb = Z
  End Select

  If Zaehler = 3 And Gueltig = 1 Then
    Portb = Granted
  Elseif Zaehler = 3 And Gueltig = 0 Then
    Portb = Denied
    'Pause (Zeit Var nachschauen)
    Gueltig = 1
  End If

Loop

Taste:

  B = Pind

  Select Case B
    Case &B0000000 : Z = 0
    Case &B0000001 : Z = 1
    Case &B0000010 : Z = 2
    Case &B0000011 : Z = 3
    Case &B0000100 : Z = 4
    Case &B0000101 : Z = 5
    Case &B0000110 : Z = 6
    Case &B0000111 : Z = 7
    Case &B0001000 : Z = 8
    Case &B0001001 : Z = 9
    Case &B0001010 : Z = 10
    Case &B0001011 : Z = 11
    Case &B0001100 : Z = 12
    Case &B0001101 : Z = 13
  End Select

  Zaehler = Zaehler + 1

  If Zaehler = 1 Then
    If Z = 3 Then
      Zahl1 = 1
    Else
      Gueltig = 0
    End If
  Elseif Zaehler = 2 And Gueltig = 1 Then
    If Z = 4 Then
      Zahl2 = True
    Else
      Gueltig = 0
    End If
  Elseif Zaehler = 3 And Gueltig = 1 Then
    If Z = 5 Then
      Zahl3 = 1
    Else
      Gueltig = 0
    End If
  End If

Return

von Nixweiss (Gast)


Lesenswert?

Dim B As Byte haste vergessen

von manuche (Gast)


Lesenswert?

Ach herlich...
Manchmal sieht man halt den Wald vor lauter Bäumen nicht mehr! -.-
Aber Danke ich werd's sofort testen!!!
[indenbartnuschel]wo hab ich denn bloß das B 
hingepackt[/indenbartnuschel]
greetz

von Bastian (Gast)


Lesenswert?

hi  manuche,

darf ich mal fragen, was du mit folgendem bewirkst/bewirken willst?

Const GRANTED As STRING     'String!!
  Granted = Access Granted
Const Denied As String
  Denied = Access Denied


  If Zaehler = 3 And Gueltig = 1 Then
    PORTB= GRANTED                        'Portb=String????
  Elseif Zaehler = 3 And Gueltig = 0 Then
    Portb = Denied                         'Portb=String????
    'Pause (Zeit Var nachschauen)
    Gueltig = 1
  End If

Willst du das auf einem LCD ausgeben, dann fehlt noch print davor.
Versteh nicht so ganz, was du damit bezweckst, würd mich interessieren.

Danke

Gruß
Bastian

von Nixweiss (Gast)


Lesenswert?

sieht wie ein code schloss aus

von manuche (Gast)


Lesenswert?

Soll es auch werden wenn es fertig ist...
Aber das man wenigstens erkennt was es werden soll pusht mein Ego graden 
enorm! ;)

von Bastian (Gast)


Lesenswert?

Ja, sieht so aus.
Nur weißt er einem Port einen String zu!?
Denke eher er will den Text "Zutritt gewährt/verweigert" ausgeben und 
nicht einem Port zuweisen, oder?

Gruß
Bastian

von manuche (Gast)


Lesenswert?

@Bastian: Wenn nach 3 Tastendrücken der Code richtig eingegeben wurde 
soll der Text aus dem String "Granted" ausgegeben werden bzw. 
andersherum der String "Denied"...
Weiss aber selber das noch nen paar Schnitzer drin sind. Is mein erstes 
Programm für Mikrokontroller und ich hab (noch) keine Möglichkeit es zu 
testen!
Also lange rede kurzer Sinn: Ich hab überhaupt keine Erfahrung damit und 
weiss auch nich wie was umgesetzt werden kann!!!
Ich hoffe mit Zeit kommt Rat...

von Nixweiss (Gast)


Lesenswert?

schau da mal vorbei ist ein grundlehrgang für bascom.
hier im forum gibts auch einige nützliche themen,
bei Codesammlung .

http://bascom-forum.de/index.php/topic,10.msg10.html#msg10

von Bastian (Gast)


Lesenswert?

Ach ja,

Const GRANTED As STRING     'String!!
  Granted = "Access Granted"

den Text, den du dem String übergeben willst mußt in " " setzen...

Bastian

von Nixweiss (Gast)


Lesenswert?

dim Granted as string*14

Granted = "Access Granted"
so wäre es richtig

von Bastian (Gast)


Lesenswert?

Ok, dann würd ich mal daraus schließen, daß du ein Alphanum.LCD 
anschließt.
Der Befehl für eine Ausgabe darauf würd ich dann so machen:

If Zaehler = 3 And Gueltig = 1 Then
    Print "Access Granted"

Die vorherige Definition von deiner Stringvariablen Granted kannst dir 
dann sparen, weil an der Stelle eh nur ein Konst. Text ausgegeben wird.

Gruß
Bastian

von Nixweiss (Gast)


Lesenswert?

string macht nur sinn wenn man was über die RS232
an den PC sendet

von Bastian (Gast)


Lesenswert?

Sorry, hab mich selber jetzt auch verschrieben.

also print "auszugebender String" für Ausgaben über RS232
     lcd "auszugebender String" für Ausgaben auf den LCD

Wenn du ein Code-Schloß verwirklichen willst, kannst dich ja bei 
folgendem Link etwas inspirieren lassen:

http://www.mcselec.com/index.php?option=com_content&task=view&id=160&Itemid=57

Gruß
Bastian

von manuche (Gast)


Lesenswert?

Hallo, ich hab jetzt vorläufig erstmal folgenden Code getestet:

$regfile = "2313def.dat"
$crystal = 3686400

Ddrb = &B11111111
Ddrd = &B1110000

On Int0 Taste
Config Int0 = Rising
Enable Int0
Enable Interrupts

Dim B As Byte
Dim Z As Integer
Dim Zahl1 As Boolean
Dim Zahl2 As Boolean
Dim Zahl3 As Boolean
Dim Zaehler As Integer
  Zaehler = 0
Dim Gueltig As Boolean
  Gueltig = 1
'Code: Z = 3, Z = 4, Z = 5

Z = 15

Do
  Select Case Z
    Case 0 To 13 : Portb = Z
  End Select
  If Zaehler = 3 And Gueltig = 1 Then
    Print "Acces granted"
  Elseif Zaehler = 3 And Gueltig = 0 Then
    Print "Access denied"
    'Pause (Zeit Var nachschauen)
    Gueltig = 1
  End If
Loop

Taste:
  B = Pind
  Select Case B
    Case &B0000000 : Z = 0
    Case &B0000001 : Z = 1
    Case &B0000010 : Z = 2
    Case &B0000011 : Z = 3
    Case &B0000100 : Z = 4
    Case &B0000101 : Z = 5
    Case &B0000110 : Z = 6
    Case &B0000111 : Z = 7
    Case &B0001000 : Z = 8
    Case &B0001001 : Z = 9
    Case &B0001010 : Z = 10
    Case &B0001011 : Z = 11
    Case &B0001100 : Z = 12
    Case &B0001101 : Z = 13
  End Select

  Zaehler = Zaehler + 1

  If Zaehler = 1 Then
    If Z = 3 Then
      Zahl1 = 1
    Else
      Gueltig = 0
    End If
  Elseif Zaehler = 2 And Gueltig = 1 Then
    If Z = 4 Then
      Zahl2 = 1
    Else
      Gueltig = 0
    End If
  Elseif Zaehler = 3 And Gueltig = 1 Then
    If Z = 5 Then
      Zahl3 = 1
    Else
      Gueltig = 0
    End If
  End If

Return

Ich hab das Programm kompiliert und auf dem Chip gespeichert. Die 
Einstellungen vom Bascon Programmer müssten auch alle korrekt sein und 
der Chip ist auch neu gebootet. Wollte mit dem Programm AVRTerminal die 
Ausgabe am PC überprüfen nur leider kommt da keine Ausgabe... Hab ich 
was übersehen oder liegt der Fehler im Quellcode?
Danke schonmal für die Mühen!!!

von Nixweiss (Gast)


Lesenswert?

haste auf 9600baud gestellt.
$baud = 9600

von manuche (Gast)


Lesenswert?

heisst was? hat nich funktioniert aber hat wer noch ne andere idee?

von Nixweiss (Gast)


Lesenswert?

$baud = 9600 das muss in den basom code
AVRTerminal muss dann auch auf 9600 eingestellt werden.

von manuche (Gast)


Lesenswert?

ja hab ich... und beim AVRTerminal steht unten bei connct:
COM1:9600,8,1,N
Weiss zwar nich was es bedeutet aber denke es ist richtig, oder? xD

von Karl H. (kbuchegg)


Lesenswert?

manuche wrote:
> heisst was? hat nich funktioniert aber hat wer noch ne andere idee?

Ja fang, kleiner an.

Einfach nur ein Programm, welches eine Ausgabe eines fixen
Textes auf die Serielle macht.

von Nixweiss (Gast)


Lesenswert?

welches board hast du-ist da ein MAX232 drauf ?

von manuche (Gast)


Lesenswert?

Ja danke karl-heinz sehr produktiv -.-
programmieren is nich das problem aber ich hab keine lust wieder laufen 
zu lernen...
@nixweiss: ja das ist ein max232 drauf!!!

von Nixweiss (Gast)


Lesenswert?

hast du einen schaltplan vom board ??

von Karl H. (kbuchegg)


Lesenswert?

manuche wrote:
> Ja danke karl-heinz sehr produktiv -.-
> programmieren is nich das problem aber ich hab keine lust wieder laufen
> zu lernen...

Na, du musst es ja wissen.

Ts, ts.
Hat ein für BASCOM umfangreiches Programm, welches nicht geht
und keine Ahnung woran es liegt und ist zu faul den 3 Zeiler
in BASCOM zu schreiben, mit dem er abklären könnte ob die
Serielle grundsätzlich funktioniert.

Viel Spass noch.

von Simon K. (simon) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:
> Ts, ts.
> Hat ein für BASCOM umfangreiches Programm, welches nicht geht
> und keine Ahnung woran es liegt und ist zu faul den 3 Zeiler
> in BASCOM zu schreiben, mit dem er abklären könnte ob die
> Serielle grundsätzlich funktioniert.

Und der dazu nicht weiß, wofür die 9600 steht. Also kann man davon 
ausgehen, dass du nicht weißt, wie eine UART funktioniert?

von Reinhard (Gast)


Lesenswert?

Wenn ich mir den Code zwischen Do ... Loop und
die Variablen-Belegung darüber ansehe, dann wird
wohl kein Print ausgeführt.

Egal, ob nun 9600 Baud im Code stehen oder nicht ...

- Reinhard -

von Nixweiss (Gast)


Lesenswert?

$regfile = "2313def.dat"
$crystal = 3686400



$baud = 9600
Print "Hallo"
end

probier das mal -wenn das nicht klappt liegts an deiner hartware.

von manuche (Gast)


Lesenswert?

naja wenigstens hab ich ja noch nixweiss...
btw: den quelltext hab ich selbst geschrieben für meine bruder... also 
der is für den anderen kram zuständig (hardware etc.), um das 
softwarezeugs hab ich mich gekümmert! hatte eigentlich erwartet das nen 
paar mehr leute ausser nixweiss mir helfen anstatt sich über 
quereinsteiger auszulassen!

von Nixweiss (Gast)


Lesenswert?

hier gibts kaum bascom leute-hauptsächlich C und ASM.
dann muste in ein anderes forum gehen.

von tastendrücker (Gast)


Lesenswert?

> naja wenigstens hab ich ja noch nixweiss...
> btw: den quelltext hab ich selbst geschrieben für meine bruder... also
> der is für den anderen kram zuständig (hardware etc.), um das
> softwarezeugs hab ich mich gekümmert! hatte eigentlich erwartet das nen
> paar mehr leute ausser nixweiss mir helfen anstatt sich über
> quereinsteiger auszulassen!

Jetz schlägt's aber 13!  Genau den Dreizeiler, den dir nixweiss gepostet 
hat, hat dir doch Karl Heinz 7 Posts vorher vorgeschlagen zu 
programmieren - woraufhin du ihn mit den Worten

>  Ja danke karl-heinz sehr produktiv -.-
>  programmieren is nich das problem aber ich hab keine lust wieder laufen
>  zu lernen...

anmachst?

Na denn viel Spass noch...

PS: Software für µCs zu schreiben erfordert übrigens eine umfangreiche 
Kenntnis über die verwendete Hardware.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Welchen Sinn hat eigentlich das hier:

  B = Pind
  Select Case B
    Case &B0000000 : Z = 0
    Case &B0000001 : Z = 1
    Case &B0000010 : Z = 2
    Case &B0000011 : Z = 3
    Case &B0000100 : Z = 4
    Case &B0000101 : Z = 5
    Case &B0000110 : Z = 6
    Case &B0000111 : Z = 7
    Case &B0001000 : Z = 8
    Case &B0001001 : Z = 9
    Case &B0001010 : Z = 10
    Case &B0001011 : Z = 11
    Case &B0001100 : Z = 12
    Case &B0001101 : Z = 13
  End Select

Da wird doch Z der Wert von B zugewiesen, sofern B im Wertebereich 
[0..13] liegt. Auch in Bascom kann sowas einfacher formuliert werden.

Hat es außerdem einen tieferen Sinn, daß die Konstanten nur 7 Bit groß 
sind?

von Stephan H. (stephan-)


Lesenswert?

@manuche,

bei so wenig Ahnung von Bits, Bytes und UARTS sollte man hier leiber 
DANKEND jeden Rat annehmen und beherzigen, anstatt hier Leute anzumachen 
die Dein Programm aus dem Nichts in 20 Min neu schreiben könnten.
Sonst könnte es sein das dein Programm NIE fertig wird.

von Karl H. (kbuchegg)


Lesenswert?

> hatte eigentlich erwartet das nen
> paar mehr leute ausser nixweiss mir helfen anstatt sich über
> quereinsteiger auszulassen!

Niemand hat sich über dich ausgelassen.

Das hier:

> Ja fang, kleiner an.
>
> Einfach nur ein Programm, welches eine Ausgabe eines fixen
> Textes auf die Serielle macht.

War absolut ernst gemeint!
Wenn du mit einem System Schwierigkeiten hast, dann ist eine
Fehlersuchstrategie die, das System abzuspecken, bis nur noch
das Subsystem übrig bleibt, welches Ärger macht.
In deinem Fall: Du kriegst keine Ausgabe.
Das kann viele Ursachen haben. Zb
* du hast einen Fehler in deinem Programm
* die UART ist nicht richtig initialisiert
* du verwendest das falsche Kabel
* dein AVR läuft auf einer völlig anderen Taktfrequenz
  als du glaubst.
* der Leitungstreiber hat einen Schaden
* Wackelkontakt
* etc.

Die meisten dieser möglichen Fehler haben erst mal nichts
mit deinem Programm zu tun.
Daher ist es eine gute Strategie, mal eben abzuklären, ob das
Subsystem UART überhaupt funktioniert. Grade mit BASCOM ist das
nun wirklich kein Problem. Den 3-Zeiler hättest du in 2 Minuten
schreiben und ausprobieren können und hättest dann gewusst ob
es an deinem konkreten Programm (weil zb. die Ausgabe nie
erreicht wird) oder ob es an der UART liegt. Mit diesem
Wissen ist es auch viel leichter zielgerichtet nach
Fehlern zu suchen und anstatt von 16:00 bis 22:00 Däumchen
zu drehen, hätte man ganz schnell abklären können, in welchem
Bereich denn das Problem liegt.

Aber ich wage mal einen Schuss ins Blaue:
Deien Fuse-Bits stimmen nicht. Daher läuft der Prozessor nicht
mit den im Programm angegebenen 3.irgendwas Mhz sondern immer
noch mit 1Mhz auf dem internen Takt.

von Der Hubert (Gast)


Lesenswert?

>> Ddrb = &B11111111
>> Ddrd = &B1110000

Absicht ??

fehlt da nicht in der 2. Zeile ne Stelle ??

von manuche (Gast)


Lesenswert?

Also wollte mich erstmal dafür entschuldigen dass ich auf manche Posts 
ein wenig forsch reagiert hab... Sorry dafür an dieser Stelle!!! Auf 
jeden Fall hab ich dadurch jetzt ein paar Anstätze um die ich mich nun 
kümmern kann.

@Rufus: Mit der Variable wird im Verlauf des Programms z.b. der Code vom 
Tastenschloss überprüft... Geht sicherlich schöner, aber ich hab's 
einfach noch von meinem Bruder übernommen weil ich mir gedacht hab dass 
ich gut damit arbeiten kann!

@Hubert: Weiss nicht ob das Absicht ist... xD Hab ich ebenfalls so 
übernommen...
>> Ddrb = &B11111111
>> Ddrd = &B1110000

Ob das bei der Fallentscheidung stimmt kann ich nicht sagen muss ich 
mich mit meinem Bruder kurz schliessen... Also für mich hört sich das so 
an dass da jetzt eine 1 bzw 0 fehlt weil ein Byte ja 8 Bits hat, oder 
sehe ich das jetzt falsch?

Gruß manuche

ps: Hoffe es kann auf dem Niveau weiter gehen und es hat jetzt nich 
jeder die Lust am Thema verloren ;) !!! Sorry nochmal: Mein Fehler!

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.