Mach's so für alle Pins:
Config Pinb.2 = Input
Die Zeile Ein = Portb.2 / 16 verstehe ich nicht.
Gruß Dirk
Zu aller erst, ich bin bei Microcontrollern noch blutiger Anfänger und das ist meine erste Schaltung damit. Ich habe allerdings vorher schon mit FreeBASIC unter Linux und Windows ein bisschen programmiert, darum jetzt auch Bascom.
Ich habe jetzt ein HD44780 Display an meinen 2313 angeschlossen (hiernach: https://www.roboternetz.de/wissen/index.php/Bascom_und_LCD's , genau wie beschrieben, nur dass es ein andere Microcontroller ist). Damit kann ich auch wunderbar anzeigen lassen, was ich will.
Jetzt habe ich noch einen AD-Wandler TLC549 mit angeschlossen und möchte mir Spannungen anzeigen lassen.
Jetzt das Problem. Abgeguckt habe ich hier: http://www.skilltronics.de/versuch/e...nik_pc/ad.html
der wichtige Teil des Originalcodes in FreeBASIC/QuickBasic:
Und nun mein Code für den AT-Tiny2313:Code:volt = 0 OUT 1020, 2 'Strobe an OUT 1020, 0 'Strobe aus FOR leitung = 7 TO 0 STEP -1 'Der IC sendet das hoechste Bit zuerst, 'darum laeuft die Schleife rueckwaerts ein = (INP(ba + 6) AND 16) / 16 'Daten werden ueber CTS eingelesen volt = volt + ein * 2 ^ leitung 'Jedes Bit bekommt seinen Dezimalwert OUT 1020, 1 'Clock an OUT 1020, 0 'Clock aus NEXT LOCATE 10, 14 PRINT USING "###"; volt
Und hier die Fehlermeldung vom Compiler:Code:$regfile = "2313def.dat" Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Config Portb.3 = Output Portb.3 = 0 Config Portb.2 = Input Portb.2 = 0 Config Portb.1 = Output Portb.1 = 0 Dim Volt As Single Dim Leitung As Single Dim Ein As Single Do Volt = 0 Portb.3 = 1 Portb.3 = 0 For Leitung = 7 To 0 Step -1 Ein = Portb.2 / 16 Volt = Volt + Ein * 2 ^ Leitung Portb.1 = 1 Portb.2 = 0 Next Cls Locate 1 , 1 Lcd Volt Loop
http://www.imageup.de/my.php?image=bcerr.JP.76xi.jpg (tut mir leid wegen der Werbung, aber imageshack war im moment nicht zu erreichen *wunder*)
Hier noch die jeweiligen Zeilen, die die Fehler enthalten:
Code:Zeile 24: Ein = Portb.2 / 16Ich werd aus diesen Meldungen nicht schlau... Ich hoff' ihr könnt mir dabei helfenCode:Zeile 25: Volt = Volt + Ein * 2 ^ Leitung
Mach's so für alle Pins:
Config Pinb.2 = Input
Die Zeile Ein = Portb.2 / 16 verstehe ich nicht.
Gruß Dirk
Dann kommt die Fehlermeldung immer noch. Und ausserdem lese ich ja an PB2 die Daten vom ADC ein. Was hat das dann für einen Sinn?
Du hattest doch nach Kompilierungsfehlern gefragt.Was hat das dann für einen Sinn?
CONFIG Portb.7 = Input ist ein Syntaxfehler
Es muss heissen:
CONFIG Pinb.7 = Input
Das must du bei allen Pin-Definitionen so machen.
Dann gibt's noch:
CONFIG PortB = Output
Der ganze Port B wird zur Ausgabe genutzt (d.h. Pinb.0 .. 7)
Gruß Dirk
Ja, wie gesagt, die sind immer noch da.
Du hattest doch nach Kompilierungsfehlern gefragt.
Ich komme damit irgendwie nicht klar, probier auch schon die ganze Zeit herum, aber das hat weder Hand noch Fuss...
ja Bascom ist irgendwie eigen, ich blicke auch noch nicht volltändig durch, aber der Code funktioniertZitat von oiermann
Problem ist die Sprache als solchesCode:$regfile = "2313def.dat" ' specify the used micro $crystal = 4000000 ' used crystal frequency $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space Ddrb = &HFF Ddrd = &H01 Config Rc5 = Pind.2 Portd.2 = 1 Enable Interrupts Declare Sub Dimm_pwm Dim Address As Byte , Command As Byte Dim Oldaddress As Byte , Oldcommand As Byte Oldaddress = 0 Oldcommand = 0 '$lib"lcd4busy.lib" 'define the used constants 'I used portA for testing 'Const _lcdport = Portb 'Const _lcdddr = Ddrb 'Const _lcdin = Pinb 'Const _lcd_e = 1 'Const _lcd_rw = 2 'Const _lcd_rs = 3 'this is like always, define the kind of LCD Config Lcd = 20 * 4 'other options are 16 * 2 , 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 8 Dim A As Byte , Count As Long Dim Strcount As String * 12 Portb.0 = 1 'and here some simple lcd code Cursor Off Noblink Cls Locate 1 , 1 : Lcd "17tes " 'display this at the top line Wait 1 Locate 2 , 1 : Lcd "im LOOP LED blinkt1" A = Portd Portd = 1 Waitms 500 Portd = 0 Waitms 500 'Loop Locate 2 , 1 : Lcd "Waiting for RC5..." Count = 0 Call Dimm_pwm Do Getrc5(address , Command) If Address < 255 Then Count = Count + 1 'If Count.0 = 0 Then ' Compare1a = 128 'Else ' Compare1a = 32 'End If Strcount = Str(count) A = 20 - Len(strcount) Locate 1 , 8 Lcd " " Locate 1 , A Lcd Strcount End If Locate 3 , 1 : Lcd "Address=" ; Locate 4 , 1 : Lcd "Command=" ; If Address < 255 Then If Address = 54 And Command = 7 Then Toggle Portb.0 Waitms 500 Toggle Portb.0 End If If Address = 7 And Command = 54 Then Toggle Portb.0 Waitms 500 Toggle Portb.0 End If Locate 3 , 9 : Lcd Address If Command.7 = 1 Then Portd = 1 : Command.7 = 0 Compare1a = 200 Else Portd = 0 Compare1a = 8 End If Locate 4 , 9 : Lcd Command If Command <> Oldcommand Or Address <> Oldaddress Then Oldcommand = Command Oldaddress = Address Locate 2 , 1 : Lcd " " Locate 2 , 1 : Lcd "Old..." Locate 2 , 7 : Lcd Oldaddress ; " ..." Locate 2 , 11 : Lcd Oldcommand ; " ..." Locate 2 , 15 : Lcd "Wait" Count = 0 End If Else Locate 3 , 9 : Lcd " " Locate 4 , 9 : Lcd " " End If Loop End Sub Dimm_pwm Dim I As Byte , J As Byte For I = 1 To 2 For J = 255 To 64 Step -10 Compare1a = J Waitms 10 Next J Wait 1 For J = 64 To 255 Step 10 Compare1a = J Waitms 10 Next J Wait 1 Next I End Sub
folgendes wollte ich, gab Fehlermeldungen,
If ((Address = 54 And Command = 7) or (Address = 7 And Command = 54 ))Then
dieses funzt, ist aber doofer Stil
If Address = 54 And Command = 7 Then
Toggle Portb.0
Waitms 500
Toggle Portb.0
End If
If Address = 7 And Command = 54 Then
Toggle Portb.0
Waitms 500
Toggle Portb.0
End If
usw.
So, das compilieren hab ich nun hinbekommen und in der Hilfe auch ein bisschen gestöbert, aber das bringt mich nun auch nicht weiter.
Mit diesem Code kommen nur 1er auf dem Display, egal ob ich am Eingang des ADC etwas anlege oder frei lasse.
Was mir auch noch komisch vorkommt, ist soewtwas hier:Code:$regfile = "2313def.dat" Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Dim Leitung As Byte Dim A As Byte Dim Ein As Byte Dim Ein2 As Integer Dim Ein3 As Byte Dim Volt As Byte Dim Volt2 As Byte Dim Volt3 As Byte Do Portb.3 = 1 Portb.3 = 0 For Leitung = 7 To 0 Step -1 If Pinb.2 = 0 Then A = 0 If Pinb.2 = 1 Then A = 1 Ein = A * 16 Ein2 = Ein And 16 Ein3 = Ein2 / 16 Volt = Volt + Ein3 Volt2 = Volt * 2 Volt3 = Volt2 ^ Leitung Portb.1 = 1 Portb.1 = 0 Next Lcd Volt3 Loop
In FreeBASIC wäre das so a = a + b * c ^ d gewesen, aber wenn ich das so reinschreibe, bringt der Compiler wieder FehlermeldungenCode:a = a + b a2 = a * c a3= a2 ^ d
//edit2:
jar_: Ja der Dialekt ist eigen, aber dein Code hat doch hoffentlich nichts mit meinem Problem zu tun oder? Da komm ich nich mit...
mein code hat nix mit deinem zu tun, wollte nur zeigen was als alter basic progger zu Fehlermeldungen vom Bascom führtZitat von oiermann
zu deinem Problem, warum nicht erst mal ADC lesen und ausgeben, warum schon vorher in IF abfragen verstecken und rechnen, muss man sich nicht über Fehler wundern, ich würde erst den ADC Port mit Multimeter versehen und schaun das ich passende Digiwerte lese
Hallo oiermann,
das sieht doch schon gut aus.
Ich kenne den TLC549 nicht, aber er gibt doch nur 8 Bits beginnend mit dem MSB aus. Oder?
Da reicht eine Schleife, wie du sie schon hast (0..7).
Darin sind die Hauptbefehle
SHIFT Ergebnis , LEFT , 1
Ergebnis = Ergebnis + Eingabepin
Ergebnis ist deine 8-Bit-Variable für das Ergebnis (0..255), Eingabepin war ja bei dir Pinb.2
Das ist alles.
Schau dir den Befehl SHIFT in der Bascom-Hilfe an.
Gruß Dirk
Jar_: achsoo, ich hab' mich schon gewundert...
Dirk: jetzt muss ich in die Schule, werd mir das heute Mittag mal ansehen. Hier ist er nocheinmal gut erklärt http://www.franksteinberg.de/SOURCE/TLC549.TXT
Lesezeichen