PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Analogeingang ohne Funktion?



TobiasBlome
10.10.2010, 20:12
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


$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

TobiasBlome
17.10.2010, 20:35
So,
ich habe einen neuen µC bestellt, der ist nun angekommen und der Fehler ist weg!

Ich kann mir zwar nicht erklären, warum der 1te µC kaputt ist, aber nun geht´s ja ;-)

trotzdem vielen Dank an alle und guten Start in die neue Woche

Tobias