Hallo,
ich habe mir einen Datenlogger gebaut.
Leider werden zwei Analogeingänge nicht richtig eingelesen. Es sieht so aus als wenn ich die Eingänge als Ausgänge programmiert hätte oder so.
Auf der Platine habe ich diese beiden Eingänge entlötet(auch nachgemessen)! Wenn ich zwischen einem Eingang und Masse den Strom messe habe ich 51mA!!!(bei dem anderen Ausgang 20mA)
Aufgefallen ist mir das, weil alle Analogeingänge mit je 10kOhm an Masse liegen und nur diese beiden Werte anzeigten: ADC1: 517 fest bzw. ADC2: 619...656
Kann mir jemand sagen wo ich den Programmierfehler habe?
Es geht um PA1/ADC1 und PA2/ADC2.
Tobias
Code:$regfile = "M644def.dat" $crystal = 20000000 $hwstack = 200 $swstack = 200 $framesize = 400 $baud = 19200 '------------------------------------------------------------------------------- 'Ein- Ausgänge: Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0 'Ddrb = &B00000000 '1 Ausgang, 0 Eingang = Pin PB7-0 Ddrc = &B00000000 '1 Ausgang, 0 Eingang = Pin PC7-0 Ddrd = &B11000000 '1 Ausgang, 0 Eingang = Pin PD7-0 Config Pinb.4 = Output 'CS Config Pinb.6 = Input 'MISO / DO $include "config_mmc.bas" $include "config_avr-dos.bas" '------------------------------------------------------------------------------- 'ALIAS J1 Alias Pinc.2 'Schalter logging J2 Alias Pinc.1 J3 Alias Pinc.0 'LogZeit Led1 Alias Portd.6 'unten links Led2 Alias Portd.7 'unten rechts '------------------------------------------------------------------------------- Print "POWER ON..." Led2 = 1 'LED rechts '------------------------------------------------------------------------------- 'Timer0 = 8Bit 'für Drehzahlmessung Config Timer0 = Timer , Prescale = 256 'Teiler 256 = 78125Hz @ 20MHz On Timer0 Ontimer0overflow 'Unteprogramm aufrufen 'Timer0 = Timer0vorgabe Enable Timer0 'timer einschalten 'Timer1 = 16 Bit 10 mal pro Sek @ 20MHz Config Timer1 = Timer , Prescale = 64 'Teiler 1/8/64/256/1024 On Timer1 Ontimer1overflow 'Unteprogramm aufrufen Const Timer1vorgabe = 34286 '34286=10x/sek 49911=5x/sek Timer1 = Timer1vorgabe Enable Timer1 'timer einschalten 'Timer2 = 8 Bit 'Config Timer2 = Timer , Prescale = 1024 'Teiler 1/8/64/256/1024 'On Timer2 Ontimer2overflow 'Unteprogramm aufrufen 'Const Timer2vorgabe = 111 '111 = 100x / sec 'Timer2 = Timer2vorgabe 'Enable Timer2 'timer einschalten '------------------------------------------------------------------------------- 'Für RS232: On Urxc Onrxd 'Interrupt-Routine setzen Enable Urxc 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen '------------------------------------------------------------------------------- 'Analogmessung: Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc 'Starte analog Messung '------------------------------------------------------------------------------- 'EEPROM Variablen: Dim Lognummer_ee As Eram Word 'Anzahl der Loggings Dim Lognummer As Word '------------------------------------------------------------------------------- 'Drehzahlmessung: Config Int0 = Falling 'wechsel von High auf Low On Int0 Drehzahl_0 'Interrupt-Routine '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Variablen: 'SD Dim Tmpbyte As Byte 'zum initialisieren Dim Btemp1 As Byte 'zum initialisieren 'Analogeingänge Dim K0 As Integer 'Spannung Empfänger Dim K1 As Integer 'Spannung Akku Dim K2 As Integer 'Strom Akku Shunt Dim K3 As Integer 'Strom Akku Hallsensor Dim K4 As Integer 'RES Dim K5 As Integer 'RES Dim K6 As Integer 'RES Dim K7 As Integer 'Temp. Dim Anzahl As Long 'Zähler für schreiben Dim Anzahl_str As String * 6 Dim Zu_schreiben As String * 70 Dim Rec As Bit 'wird von J1 oder Empfänger(Pulsein) gesetzt Dim Rec_z As Word 'wird von Timer 1 hochgezählt 5*/sec Dim Rec_sd As Bit 'Datei öffnen schließen Dim Led As Word Dim Led_wert As Word 'Wert für blinken Dim Logzeit As Word 'Einstellung wie oft loggen Dim Loginfo As String * 20 'Text in txt Datei wie oft/sec geloggt wurde 'RC-Empfänger auswerten Dim Pulsbreite1 As Word 'Knüppelstellung Knüppel 1 Dim Pulsbreite11 As String * 3 Dim Pulsbreite2 As Word 'Knüppelstellung Knüppel 2 Dim Pulsbreite22 As String * 3 'Drehzahlmessung Dim T01 As Byte 'Wert Timer0 Dim T02 As Integer 'Wert Timer0 Anzahl Überläufe Dim Drehzahl_t01 As Byte Dim Drehzahl_t02 As Integer Dim Drehzahl As Single 'Drehzahl umgerechnet Dim Drehzahl1 As Word 'gerundeter Wert Dim Drehzahl_s As String * 6 'Drehzahl für Ausgabe 'RS232 Empfang Dim Slave As String * 3 Dim Parameter As String * 10 Dim Wert As String * 10 Dim Ampere_rs As String * 4 'von der RS 232 Schnittstelle Dim Volt_rs As String * 4 'von der RS 232 Schnittstelle Dim E_byte As Byte , E_flag As Byte Dim Zyklus As Long 'incr bei jeder Do...Loop! '------------------------------------------------------------------------------- 'Variablen belegen: Lognummer = Lognummer_ee 'Wert von EEPROM auslesen Print "lognummer: " ; Lognummer Waitms 500 Print "START SD-Test..." '_______________________________________________________________________________ 'Init MMC/SD Card Tmpbyte = Driveinit() Print "Init: " ; Str(tmpbyte) Print "Trying to read File system..." Btemp1 = Initfilesystem(1) ' Partition 1 Print "Btemp1: " ; Btemp1 ; " 0=ok" If Btemp1 <> 0 Then 'Wenn Fehler Print "Error: " ; Btemp1 ; " beim Initialisieren des Dateisystems" Waitms 500 Print "SD - FEHLER" Goto Fehler Else Print "SD-Card OK" End If '_______________________________________________________________________________ 'LogZeit Festlegen If J3 = 0 Then Logzeit = 1 '10 mal pro Sek. loggen Loginfo = " (Log 10x / sek)" 'Text in txt Datei Else Logzeit = 10 '1 mal pro Sek. loggen Loginfo = " (Log 1x / sek)" 'Text in txt Datei End If Print Loginfo Enable Int0 'Drehzahlmessung 1 aktiv Enable Interrupts 'Interrupts global '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Led1 = 1 'LED unten links an Led2 = 0 'LED unten rechts aus Do Incr Led 'led hochzählen Toggle Led1 'Aufnahme Rec = J1 'Jumper zum Aufzeichnen 'Steuerung LED2(rechts) für "logging ON/OFF" If J1 = 1 And Rec_sd = 1 Then Led2 = 1 'LED unten rechts an 'langsam Else Led2 = 0 'LED unten rechts aus End If '------------------------------------------------------------------------------- 'Datei öffnen und schließen If Rec = 1 And Rec_sd = 0 Then Open "LOG.txt" For Append As #1 Print #1 , "#Lognummer: " ; Lognummer ; Loginfo Print #1 , "#Nr. ;K0 RC mV;K1 BATT mV;K2 SHUNT A;K3;K7 Temp;RC SOLL;Drehzahl;A&mV_RS" Incr Lognummer 'LogNummer hochzählen und Lognummer_ee = Lognummer 'in EEPROM übertragen Rec_sd = 1 End If If Rec = 0 And Rec_sd = 1 Then Close #1 Print "SD geschlossen" Rec_sd = 0 End If '=============================================================================== 'Eingänge Auswerten: 'Empfänger einlesen Pulsein Pulsbreite1 , Pinc , 7 , 1 'Pulsbreite auslesen (1=High Impuls) 'Analogkanäle einlesen K0 = Getadc(0) 'Wert aus Analogeingang laden K1 = Getadc(1) 'Wert aus Analogeingang laden K2 = Getadc(2) 'Wert aus Analogeingang laden K3 = Getadc(3) 'Wert aus Analogeingang laden 'K4 = Getadc(4) 'Wert aus Analogeingang laden 'K5 = Getadc(5) 'Wert aus Analogeingang laden 'K6 = Getadc(6) 'Wert aus Analogeingang laden K7 = Getadc(7) 'Wert aus Analogeingang laden Print K0 ; ";" ; K1 ; ";" ; K2 ; ";" ; K3 'Drehzahl umrechnen 'T0 zählt mit 78125 Schritte / Sec 'Drehzahl in Sek/Schritt = 1/78125*(x Schritte + Zählerüberläufe*256) Drehzahl = Drehzahl_t02 * 256 'Überläufe auswerten Drehzahl = Drehzahl + Drehzahl_t01 'Überläufe + Zählerstand von T0 Drehzahl = Drehzahl * 0.0000128 Drehzahl = 1 / Drehzahl 'nun sind es Hz Drehzahl = Drehzahl * 60 'und nun UPM Drehzahl = Drehzahl / 2 'weil eine Umdrehung 2 Impulse bei mir bringt 'ENDE Eingänge auswerten 'RS232 Empfang If E_flag = 4 Then 'Empfangsstring komplett If Slave = "S1" Then 'wenn Daten für Slave1 Select Case Parameter Case "Ampere" : Ampere_rs = Wert ' Print "#S1,Strom:" ; Wert 'Case "Volt" : Volt_rs = Wert ' Print "#S1,Strom:" ; Wert Case Else : Print "Err." End Select End If 'Daten auf jedenfall löschen Slave = "" 'Slave löschen Parameter = "" 'Parameter löschen Wert = "" 'Wert löschen E_flag = 0 'Empfang neu setzen End If '=============================================================================== 'Logging If Rec = 1 And Rec_z => Logzeit Then Incr Anzahl Anzahl_str = Str(anzahl) Anzahl_str = Format(anzahl_str , "000000") 'Alles in einen String zusammenfassen 'Zu_schreiben = Anzahl_str + ";" + Str(k0) + ";" + Str(k1) + ";" + Str(k2) + ";" + Str(k3) + ";" + Str(k4) + ";" + Str(k5) + ";" + Str(k6) + ";" + Str(k7) + ";" + Str(pulsbreite1) + ";" + Str(drehzahl) + ";" + Ampere_rs + ";" + Volt_rs Zu_schreiben = Anzahl_str + ";" + Str(k0) + ";" + Str(k1) + ";" + Str(k2) + ";" + Str(k3) + ";" + Str(k7) + ";" + Str(pulsbreite1) + ";" + Str(drehzahl) + ";" + Ampere_rs Gosub Sd_schreiben 'Print Rec_z 'Kontrolle: wenn > 1 dann Zykluszeit zu groß d.h. kein Loggen 10x/sec möglich! Rec_z = 0 'Variable von Timer zurücksetzen End If 'Datensatznummer zurücksetzen If J1 = 0 Then 'Schalter logging = 0 Anzahl = 0 End If 'Zyklus Incr Zyklus Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop ENDE - ENDE - ENDE - ENDE - ENDE - ENDE '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '_______________________________________________________________________________ 'Daten auf SD - Card schreiben: Sd_schreiben: 'Datei öffnen / erstellen wenn nicht vorhanden! 'Open "LOG.txt" For Append As #1 Print #1 , Zu_schreiben 'Variable auf SD schreiben 'Print Zu_schreiben 'Variable auf COM / PC anzeigen 'Close #1 Return '_______________________________________________________________________________ 'bei SD Fehler Do Led1 = 0 'Do...Loop Led aus Fehler: Print "Fehler!!!" Led2 = 1 'Grüne LED blinken für FEHLER Waitms 500 Led2 = 0 'Grüne LED blinken für FEHLER Waitms 500 Loop '_______________________________________________________________________________ Ontimer1overflow: '10 mal pro Sekunde Timer1 = Timer1vorgabe Incr Rec_z 'Print Zyklus 'Zyklus = 0 Return '_______________________________________________________________________________ Drehzahl_0: 'Timer1-Capture T01 = Timer0 'Erst Timer0Wert sichern Timer0 = 0 'Sofort Timer-Reset Drehzahl_t01 = T01 'Timer0Wert Drehzahl_t02 = T02 'Anzahl der Timer0 Überläufe T02 = 0 Return '_______________________________________________________________________________ Ontimer0overflow: 'für Drehzahl messung Incr T02 'Anzahl der Timer0 Überläufe Return '------------------------------------------------------------------------------- 'RS232 - Empfang - Strom von LEM 400 Onrxd: E_byte = Udr Select Case E_byte Case 35 : E_flag = 1 '"#" = Slave wird gesendet Case 44 : E_flag = 2 '"," = Parameter kommt Case 58 : E_flag = 3 '":" = Case 13 : E_flag = 4 '"13 / ENTER" = Empfang komplett Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte) If E_flag = 2 Then Parameter = Parameter + Chr(e_byte) If E_flag = 3 Then Wert = Wert + Chr(e_byte) End Select Return







Zitieren

Lesezeichen