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
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.
$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
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
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
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
@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...
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
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
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!!!
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.
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!!!
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.
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?
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 -
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!
> 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.
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?
@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.
> 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.
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!