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
Soll es auch werden wenn es fertig ist... Aber das man wenigstens erkennt was es werden soll pusht mein Ego graden enorm! ;)
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...
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
Ach ja, Const GRANTED As STRING 'String!! Granted = "Access Granted" den Text, den du dem String übergeben willst mußt in " " setzen... Bastian
dim Granted as string*14 Granted = "Access Granted" so wäre es richtig
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!!!
$baud = 9600 das muss in den basom code AVRTerminal muss dann auch auf 9600 eingestellt werden.
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
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 -
$regfile = "2313def.dat" $crystal = 3686400 $baud = 9600 Print "Hallo" end probier das mal -wenn das nicht klappt liegts an deiner hartware.
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!
hier gibts kaum bascom leute-hauptsächlich C und ASM. dann muste in ein anderes forum gehen.
> 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.
>> Ddrb = &B11111111 >> Ddrd = &B1110000 Absicht ?? fehlt da nicht in der 2. Zeile ne Stelle ??
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.