Zisternen-Überwachung mit kapazitivem Füllstandssensor

Hi HBA,

Oh Mann, SMD auf 3-Punkt Raster. Du bist wirklich verrückt.
Allerdings sehen meine Platinen auf der Rückseite meist auch so aus, weil ich keine "richtigen" Platinen machen kann. Und machen lassen ist mir zu teuer.
HBA

yip, der ist doch wirklich krank...:rolleyes:

Wie die Platinen aussehen, ist doch egal. Wir haben dauerhaft funktionsfähige Schaltungen drauf und im eigebauten Zustand sieht's eh keiner. Für jede Fitzelplatine 50, 60 Euro? Nee, ist mir auch zu teuer. Und dann muss man sich auch noch mit dem völlig überfüllten Eagle rumärgern.


Grüsse,

Michael
 
Damit wäre ich allerdings sehr vorsichtig.
Nach eigenen Aussagen benötigt Bascom für die Konvertierung in Strings (LCD und Print) 24 Byte Frame. Nimmlieber den SwStack zurück, den brauchst du eh nicht (keine Übergabe von Parametern).

jetzt steht es auf ...
Code:
$hwstack = 48
$swstack = 24
$framesize = 28
mal sehen ... ;) wegen den beiden Timer-Interrupts die sich ja theoretisch auch
überlappen können hab ich den HW-Stack noch ein wenig vergrößert. BASCOM
schiebt ja leider recht viel auf den Stack.

nebenher hab ich noch 2 Bleche Aprikosenkuchen mit Orangenüberzug und
Pistaziengestreußel gemacht ;) ... lecker :D
Aprikosenkuchen.jpg

Gruß
Dino
 
mal sehen ... ;) wegen den beiden Timer-Interrupts die sich ja theoretisch auch
überlappen können hab ich den HW-Stack noch ein wenig vergrößert.
Nö, hast du ja nicht explizit freigegeben.
Wenn ich das richtig sehe verwendet deine Tim0_isr die Register
R16, R17, R21, R24, R25, R26, R27, R30, R31 und natürlich SREG.
Tim1_isr nur R24, R26 und SREG.
Wenn du also knapp mit SRAM bist, kannst du ISRs mit Nosave aufrufen und dann nur diese Register pushen. Dann kannst du mit den HwStack auch noch weiter runter. Und wie gesagt, SwStack auf 0.

HBA
 
Wenn du also knapp mit SRAM bist, kannst du ISRs mit Nosave aufrufen und dann nur diese Register pushen. Dann kannst du mit den HwStack auch noch weiter runter. Und wie gesagt, SwStack auf 0.
Im Moment kratze ich bei Bascom noch an der Oberfläche. Zum rumfummeln in
den Innereien hat mir noch die Zeit gefehlt ... na mal sehen ... :D

Gruß
Dino
 
Oh Mann, SMD auf 3-Punkt Raster. Du bist wirklich verrückt.


Hallo HBA !

Das haben einige von hier ihm sogar schon ein paar mal persönlich gesagt. ;)

Es ist erstaunlich, welch hohe "Packungsdichte" der Dino mit Lochraster und SMD so erreicht. :D


Grüße,
Cassio
 
wird bei mir sowieso nicht da die Frequenzmessung mit freigegebenen
Interrupts erst dann anfängt wenn die 1Wire-Messung bereits erledigt ist.
Den Kommentar hatte ich irgendwie übersehen.
Das stimmt so meiner Meinung nach nicht. Du verhinderst zwar die Interrupts aber sowohl der Timer als auch der Counter laufen fleißig weiter. Und wenn du dann die Interrupts wieder global zulässt, schlagen sie sofort zu, sofern sie denn in der Zwischenzeit übergelaufen sind. Wird bei dem 1ms Timer immer der Fall sein. Die Ergebnisse sind dabei sicherlich verfälscht.

HBA
 
Hi,

Das stimmt so meiner Meinung nach nicht. Du verhinderst zwar die Interrupts aber sowohl der Timer als auch der Counter laufen fleißig weiter. Und wenn du dann die Interrupts wieder global zulässt, schlagen sie sofort zu, sofern sie denn in der Zwischenzeit übergelaufen sind. Wird bei dem 1ms Timer immer der Fall sein. Die Ergebnisse sind dabei sicherlich verfälscht.
naja ... ok ... stimmt bedingt. Wenn in der Zwischenzeit weiter Überläufe
passieren dann wird dadurch das Interruptflag des Timerüberlaufs gesetzt
und dadurch natürlich nach der globalen Freigabe der Interrupts sofort ein
Interrupt ausgelöst. In ein Flag-Bit geht nur einmal ein Interrupt rein. Egal
wieviele Überläufe zwischenzeitlich passiert sind. Es gibt nur einen Interrupt.
So ist jedenfalls meine Info und so habe ich es auch beim PinChangeInterrupt
schon erlebt. Also maximal 1ms Abweichung bei einem Zeitfenster von 1s.
Das macht einen Fehler von 0,1% ... kann ich mir dabei wohl leisten :D

Gruß
Dino
 
Es gibt nur einen Interrupt.
Ja klar, hatte ich so gesagt. Interrupts, weil es ja auch beim Counter passieren kann.

Also maximal 1ms Abweichung bei einem Zeitfenster von 1s.
Das macht einen Fehler von 0,1% ... kann ich mir dabei wohl leisten :D

Was dich wirklich vor größeren Abweichungen bewahrt ist das hier:
If Ticks = 1 Then
Timer1 = 0
T1ovf = 0
End If
Ansonsten würde der Counter auch mal Werte bis 65000 annehmen. Bei 1s Torzeit wäre das dann ein Fehler von 65KHz, der mir verglichen mit deiner Maximalfrequenz nicht als so klein vorkommt.
Aber sei's drum.

HBA
 
Hallo,

ich tippe mal das morgen die Lieferung mit - unter anderem - den Gehäusen
von Reichelt ankommt. Dann kann ich mal ne "wasserfeste" Version des
Mess-Slaves bauen.

Den Master mit der Anzeige und Relais für Abschaltung der Pumpe wenn der
Mindestpegel in der Zisterne unterschritten wird bekommt wohl nen Mega8.

Gruß
Dino
 
Hallo zusammen,

und hier nun mal ein paar Bilder von der "Sensor-Phalanx" die ich letztes
Wochenende zusammengebaut habe ...
P1050891.JPG P1050892.JPG
Jetzt ist auch ein Quarz drin und kein Keramikresonator mehr. Ein Quarz
bringt stabilere Meßwerte als nen Resonator.

Das Programm ist schon drauf und läuft ;)

Gruß
Dino
 
Hallo,

demnächst gehts hier weiter (es soll demnächst eingebaut werden) :p
ups ... da muß ich mich wohl beeilen :eek: :rolleyes:

Na mal sehen. Mal schnell ein wenig Bascom-Code zusammenschustern.

Gruß
Dino
 
Hallo,

nun hab ich mal den alten Quellcode ein wenig überarbeitet.
Dieses "Wait 1100" hat mich ungeheuer gestört. Unter anderem weil ich ja auch über UART die Sensor-Baugruppe steuern will. Wenn die aber während der Messung nur Zeit verbrennt dann geht das etwas schlecht :sarcastic:

Manoman ... knapp 1,5 Jahre Stillstand bei dem Projekt. :p :rolleyes:

Code:
' ####################################################
' ##### Zisternensensor mit AVR ATtiny2313 ###########
' ####################################################
' (c) 26.06.2012 by Dino
'
' Frequenzmessung und Temperaturmessung fuer
' Zisternenanzeige (Fuellstand und Innentemperatur)
' 51% Flash used
'
'Hardware:  PD5/T1 : Oszillatoreingang
'           PD4    : 1Wire-Sensor DS18S20 (Temperatur)
'           PD0/RxD: Kommandos empfangen 9k6 8n1
'           PD1/TxD: Daten senden 9k6 8n1

' Prozessor ATtiny2313
$regfile = "ATtiny2313.DAT"
' Systemtakt von 20MHz (externer Quarz)
$crystal = 20000000

$hwstack = 48
$swstack = 8
$framesize = 28
$noramclear




' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' DDR  =>  0-Bit = Eingang / 1-Bit = Ausgang
' PORT =>  0-Bit = PullUp aus / 1-Bit = PullUp an (bei Eingang)


' PD0 -------<---- UART RxD | UART
' PD1 --------->-- UART TxD | TTL-Pegel
' PD2/INT0 --
' PD3/INT1 --
' PD4/T0 ----<->-- 1Wire-Bus (Timer0 = 8Bit)
' PD5/T1 ----<---- Mess-Oszillator (Timer1 = 16Bit)
' PD6/ICP1 --
'
' ===== PortD =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= O=1= I=0=  => 00000010 => DDRD
' ---- ----  T1  1Wir ---- ---- TxD  RxD   => 11111101 => PORTD (init)
'  |    |    |    |    |    |    |    |
'
Ddrd = &B0000_0010
Portd = &B1111_1101


' PB0 --
' PB1 --
' PB2 --
' PB3 --
' PB4 --
' PB5/SDA -------- MOSI |
' PB6 ------------ MISO | ISP-Port
' PB7/SCL -------- SCK  |
'
' ===== PortB =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRB
' ISP  ISP  ISP  ---- ---- ---- ---- ----  => 11111111 => PORTB (init)
'  |    |    |    |    |    |    |    |
'
Ddrb = &B0000_0000
Portb = &B1111_1111


' PA0 -- XTAL1 | Systemquarz
' PA1 -- XTAL2 | 20,000MHz
' PA2 -- RESET
'
' ===== PortA =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRA
' ---- ---- ---- ---- ---- Rst  XTl1 XTl2  => 11111111 => PORTA (init)
'  |    |    |    |    |    |    |    |
'
Ddra = &B0000_0000
Porta = &B1111_1111




' ===== UART (TTL) initialisieren =============================================
Config Com1 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Config Serialin = Buffered , Size = 4                       ' Buffer kostet wertvolles SRAM
Open "com1:" For Binary As #1
' Clear Serialin                                              ' Braucht man ohne Buffer auch nicht


' ===== 1Wire-Bus DS18S20 Temperatursensor ====================================
Config 1wire = Portd.4


' ===== Timer Initialisieren ==================================================
Config Timer0 = Timer , Prescale = 256                      ' Timer0 liefert die Messzeit (1sec)
On Ovf0 Tim0_isr

Config Timer1 = Counter , Edge = Falling , Prescale = 1     ' Timer1 zaehlt die Eingangstakte
On Ovf1 Tim1_isr

Enable Timer0
Enable Timer1




' ####################################
' ##### DEFINITION DER VARIABLEN #####
' ####################################
'
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte                                      ' Array fuer Scratchpad

' Variablen fuer DS18S20 Temperatur
Dim Ds_count As Byte                                        ' Zaehler fuer Scratchpad bearbeiten                                 '
Dim Deg_lo As Byte                                          ' unteres Temperaturbyte
Dim Deg_hi As Byte                                          ' oberes Temperaturbyte

' Variablen fuer Frequenzmessung
Dim Ticks As Word                                           ' Zaehler fuer Messinterfall in 1ms-Ticks
Dim Cnt_lo As Byte                                          ' Wert des Low-Bytes vom 16Bit-Timer 1
Dim Cnt_hi As Byte                                          ' Wert des High-Bytes vom 16Bit-Timer 1
Dim Cnt_ovf As Word                                         ' Wert vom 16-Bit Ueberlaufzaehler fuer 16Bit-Timer 1
Dim T1ovf As Word                                           ' 16-Bit Ueberlaufzaehler fuer 16Bit-Timer 1

Dim Temp As Byte                                            ' Temporaere Byte-Variable fuer alles moegliche




' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do


  ' Damit man mit dem "Wait 1100" nicht unnoetig Zeit verbrennt habe ich das Messende nun ueber ein Flag
  ' anzeigen lassen. Nun kann man waehrend der Messzeit auch noch was anderes machen.
  If Temp = 0 Then                                          ' Test ob die Messung zu Ende ist
    ' Die Messung laeuft noch

    ' ===== Messungen ausschalten ===== Character "e" (ende)
    ' Disable Interrupts
    ' Temp = 0
    ' Senden "EE EE EE EE EE EE EE EE EE EE ...."

    ' ===== Messungen einschalten ===== Character "a" (anfang)
    ' Gosub Ds18s20_mess                                      ' 1Wire Messung starten - der Chip arbeitet alleine weiter
    ' Senden "AA AA AA AA AA AA AA AA AA AA ...."
    ' Temp = 0                                                ' Temp als Flag nutzen : Messung noch nicht fertig
    ' ----- Frequenz-Messung starten -----
    ' Ticks = 0                                               ' Timer0-Ticks initialisieren
    ' Enable Interrupts                                       ' Interrupts für Frequenzmessung anschalten
    '                                                         ' Die Frequenzmessung sollte nach 1 sec beendet sein.
                                                             ' und damit die Interrupts auch wieder abgeschaltet (siehe ISR)
    '

  Else                                                      ' Frequenz-Messung ist zu Ende

    Gosub Ds18s20_temp                                      ' 1Wire Temperatur abfragen (vom letzten Messzyklus)
    Gosub Ds18s20_mess                                      ' 1Wire Messung starten - der Chip arbeitet alleine weiter

    ' Uebertragung der Daten ueber UART (1k2 8n1) im Binaerformat mit crlf (0D 0A) als Endmarke
    ' Daten des Temperatursensors (Scratchpad des DS18S20) ausgeben
    For Ds_count = 1 To 9
      Printbin #1 , Ds18s20(ds_count);                      ' Scratchpad auf UART ausgeben
    Next

    ' 32Bit Frequenzmessung ausgeben
    Temp = High(cnt_ovf)
    Printbin #1 , Temp;                                     ' Frequenzmessung auf UART ausgeben (Bits 31-24)
    Temp = Low(cnt_ovf)
    Printbin #1 , Temp;                                     ' Frequenzmessung auf UART ausgeben (Bits 23-16)
    Printbin #1 , Cnt_hi ; Cnt_lo                           ' Frequenzmessung auf UART ausgeben (Bits 15-0)

    Temp = 0                                                ' Temp als Flag nutzen : Messung noch nicht fertig
    ' ----- Frequenz-Messung starten -----
    Ticks = 0                                               ' Timer0-Ticks initialisieren
    Enable Interrupts                                       ' Interrupts für Frequenzmessung anschalten
    ' Waitms 1100                                             ' Die Frequenzmessung sollte nach 1,1sec beendet sein.
                                                             ' und damit die Interrupts auch wieder abgeschaltet (siehe ISR)
  End If




Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################




' ============================================
' ===== Sub fuer DS18S20 Messung starten =====
' ============================================
Ds18s20_mess:
  ' ===== Befehlsbytes =====
  ' SEARCH ROM [F0h]
  ' READ ROM [33h]
  ' MATCH ROM [55h]
  ' SKIP ROM [CCh]
  ' ALARM SEARCH [ECh]
  ' CONVERT T [44h]
  ' WRITE SCRATCHPAD [4Eh]
  ' READ SCRATCHPAD [BEh]
  ' COPY SCRATCHPAD [48h]
  ' RECALL E2 [B8h]
  ' READ POWER SUPPLY [B4h]
  1wreset                                                   ' 1Wire-Bus zuruecksetzen
  1wwrite &HCC                                              ' Alle 1Wire-Devices ansprechen
  1wwrite &H44                                              ' Temperaturmessung starten
Return




' ================================================
' ===== Sub fuer DS18S20 Temperatur einlesen =====
' ================================================
Ds18s20_temp:
  ' ===== Scratchpad =====
  ' 1. Byte 0 - Temperature LSB
  ' 2. Byte 1 - Temperature MSB
  ' 3. Byte 2 - TH Register or User Byte 1 <-> TH Register or User Byte 1
  ' 4. Byte 3 - TL Register or User Byte 2 <-> TL Register or User Byte 2
  ' 5. Byte 4 - Reserved (FFh)
  ' 6. Byte 5 - Reserved (FFh)
  ' 7. Byte 6 - COUNT REMAIN
  ' 8. Byte 7 - COUNT PER deg
  ' 9. Byte 8 - CRC8
  ' ===== Seriennummer / ROM-Code =====
  ' 8-BIT CRC , 48-BIT SERIAL NUMBER , 8-BIT FAMILY CODE (10h)
  ' ===== Temperaturberechnung =====
  ' After reading the scratchpad, the TEMP_READ value is obtained
  ' by truncating the 0.5°C bit (bit 0) from the temperature data
  ' TEMPERATURE = TEMP_READ - 0,25 + ( COUNT_PER_C - COUNT_REMAIN ) / COUNT_PER_C
  '
  1wreset                                                   ' 1Wire-Bus zuruecksetzen
  1wwrite &HCC                                              ' Alle 1Wire-Devices ansprechen
  1wwrite &HBE                                              ' Scratchpad einlesen

  Ds18s20(1) = 1wread(9)                                    ' diese Version spart etwas Flash (85% zu 87%)
  '  For Ds_count = 1 To 9
  '    Ds18s20(ds_count) = 1wread()                            ' Scratchpad in Array uebertragen
  '  Next

  ' die naechsten 4 Zeilen brauch ich eigentlich nicht wenn ich sowieso immer das ganze Scratchpad sende
  ' dann kann auch der empfangende ATmega die CRC pruefen.
  If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then                 ' Wenn CRC8 korrekt dann Temperaturwerte sichern
    Deg_lo = Ds18s20(1)                                     ' Temperatur LSB
    Deg_hi = Ds18s20(2)                                     ' Temperatur MSB
  End If

Return




' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist das Gate fuer die Frequenzmessung
Tim0_isr:
  Timer0 = 178                                              ' Initialisierung fuer 1ms Takt (Prescaler 256)
  Incr Ticks                                                ' 1ms-Ticks zaehlen
  If Ticks = 1 Then                                         ' beim ersten Tick ...
    Timer1 = 0                                              ' Timer1 fuer Taktzaehlung initialisieren
    T1ovf = 0                                               ' und Timer1-Ueberlaufszaehler auf 0
  End If
  If Ticks = 1001 Then                                      ' 1sec Messzeit ist vorbei -> Werte sichern
    Cnt_lo = Tcnt1l                                         ' Frequenz LSB (Byte 1)   - Timer1 LowByte
    Cnt_hi = Tcnt1h                                         ' Frequenz     (Byte 2)   - Timer1 HighByte
    Cnt_ovf = T1ovf                                         ' Frequenz MSW (Byte 3+4) - Timer1-Ueberlaufszaehler
    Disable Interrupts
    Temp = 1                                                ' Temp als Flag nutzen : Messung ist jetzt fertig
  End If
Return




' ================================================
' ===== ISR fuer Timer1 Overflow =================
' ================================================
' Timer1 ist der Zaehler fuer die Frequenzmessung
Tim1_isr:
  Incr T1ovf                                                ' Ueberlauf vom 16Bit-Timer (Byte3+4) bearbeiten
Return




' ###############################################
' ##### Programm Ende ###########################
' ###############################################
Close #1
End

' - - - - - - - - - - - - - - - - S C H L U S S - - - - - - - - - - - - - - - - - - -
Das ist nun ein erster UNGETESTETER Quellcode. Läßt sich zwar fehlerfrei compilieren aber ob er wirklich sauber läuft weiß ich nicht. Wird man aber sehen ;)

Gruß
Dino
 
....ob er wirklich sauber läuft weiß ich nicht.


Hallo Dino!

Zwei Dinge, die mir so beim Durchsehen aufgefallen sind.....

Theoretisch solltest du eine Fehlermeldung von BASCOM erhalten,
weil du ein Komma statt ein Semikolon verwendet hast.
Siehe hier:
Code:
For Ds_count = 1 To 9
      Printbin #1[COLOR="#FF0000"] ,[/COLOR] Ds18s20(ds_count)[COLOR="#FF0000"];[/COLOR]                      ' Scratchpad auf UART ausgeben
    Next


Ich war zwar zu Beginn wegen dem "fehlenden" ENABLE INTERRUPTS etwas verwirrt.....
das machst du aber in der IF-Schleife, um sie später in der ISR auch wieder zu deaktivieren. :wink:


Dann bin ich ja mal auf den ersten Live-Test gespannt.
Wird schon schief gehen. :D

Grüße,
Cassio
 
Hi Cassio,

ich glaub nicht das Bascom meckert weil in der Referenz folgendes steht ...
Syntax
PRINTBIN var [ ; varn]
PRINTBIN #channel, var [; varn]
...
Multiple variables may be sent. They must be separated by the ; sign.
...
Printbin ar(1) ; 3 ' will send 3 bytes from array ar().
Printbin ar(1) ; 2 ; ar(2) ; 4 ' will send 2 bytes from array ar() starting at index 1,
then 4 bytes from array ar() starting at index 4.
:p :cool:
Der Datenstrom wird über Komma von den auszugebenden Werten abgetrennt.

Das Semikolon am Ende soll eigentlich ein crlf verhindern. Das habe ich vom normalen Print übernommen. Ob das auch hier so gilt müßte man mal mit nem Terminal überprüfen. Aber auch hier hat Bascom nicht gemotzt.

Gruß
Dino
 
Hallo,

so, mal ne neue Version. Ich hab noch ein wenig Fehler behoben und etwas geändert.
Code:
' ####################################################
' ##### Zisternensensor mit AVR ATtiny2313 ###########
' ####################################################
' (c) 26.06.2012 by Dino
'
' Frequenzmessung und Temperaturmessung fuer
' Zisternenanzeige (Fuellstand und Innentemperatur)
' BASCOM 2.0.7.3
' 58% Flash used
'
'Hardware:  PD5/T1 : Oszillatoreingang
'           PD4    : 1Wire-Sensor DS18S20 (Temperatur)
'           PD0/RxD: Kommandos empfangen 9k6 8n1
'           PD1/TxD: Daten senden 9k6 8n1

' Stecker Pin 1+2 = Sensor, heißes Ende (Osc)
' Stecker Pin 3+G = Sensor, kaltes Ende (GND)

' RJ45 Pin 1  = ws/or ------- TxD
' RJ45 Pin 2  = or    - GND
' RJ45 Pin 3  = ws/gn ------- RxD
' RJ45 Pin 4  = bl    - GND
' RJ45 Pin 5  = ws/bl ---- +UB
' RJ45 Pin 6  = gn    - GND
' RJ45 Pin 7  = ws/bn ---- +UB
' RJ45 Pin 8  = bn    ---- +UB
' RJ45 Schirm = Draht - GND

' Prozessor ATtiny2313
$regfile = "ATtiny2313.DAT"
' Systemtakt von 20MHz (externer Quarz)
$crystal = 20000000

$hwstack = 48
$swstack = 8
$framesize = 28
$noramclear




' ####################################
' ##### DEFINITION DER VARIABLEN #####
' ####################################
'
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte                                      ' Array fuer Scratchpad

' Variablen fuer DS18S20 Temperatur
Dim Ds_count As Byte                                        ' Zaehler fuer Scratchpad bearbeiten                                 '
Dim Deg_lo As Byte                                          ' unteres Temperaturbyte
Dim Deg_hi As Byte                                          ' oberes Temperaturbyte

' Variablen fuer Frequenzmessung
Dim Ticks As Word                                           ' Zaehler fuer Messinterfall in 1ms-Ticks
Dim Cnt_lo As Byte                                          ' Wert des Low-Bytes vom 16Bit-Timer 1
Dim Cnt_hi As Byte                                          ' Wert des High-Bytes vom 16Bit-Timer 1
Dim Cnt_ovf As Word                                         ' Wert vom 16-Bit Ueberlaufzaehler fuer 16Bit-Timer 1
Dim T1ovf As Word                                           ' 16-Bit Ueberlaufzaehler fuer 16Bit-Timer 1

Dim Temp As Byte                                            ' Temporaere Byte-Variable fuer alles moegliche




' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' DDR  =>  0-Bit = Eingang / 1-Bit = Ausgang
' PORT =>  0-Bit = PullUp aus / 1-Bit = PullUp an (bei Eingang)


' PD0 -------<---- UART RxD | UART
' PD1 --------->-- UART TxD | TTL-Pegel
' PD2/INT0 --
' PD3/INT1 --
' PD4/T0 ----<->-- 1Wire-Bus (Timer0 = 8Bit)
' PD5/T1 ----<---- Mess-Oszillator (Timer1 = 16Bit)
' PD6/ICP1 --
'
' ===== PortD =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= O=1= I=0=  => 00000010 => DDRD
' ---- ----  T1  1Wir ---- ---- TxD  RxD   => 11111101 => PORTD (init)
'  |    |    |    |    |    |    |    |
'
Ddrd = &B0000_0010
Portd = &B1111_1101


' PB0 --
' PB1 --
' PB2 --
' PB3 --
' PB4 --
' PB5/SDA -------- MOSI |
' PB6 ------------ MISO | ISP-Port
' PB7/SCL -------- SCK  |
'
' ===== PortB =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRB
' ISP  ISP  ISP  ---- ---- ---- ---- ----  => 11111111 => PORTB (init)
'  |    |    |    |    |    |    |    |
'
Ddrb = &B0000_0000
Portb = &B1111_1111


' PA0 -- XTAL1 | Systemquarz
' PA1 -- XTAL2 | 20,000MHz
' PA2 -- RESET
'
' ===== PortA =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRA
' ---- ---- ---- ---- ---- Rst  XTl1 XTl2  => 11111111 => PORTA (init)
'  |    |    |    |    |    |    |    |
'
Ddra = &B0000_0000
Porta = &B1111_1111




' ===== UART (TTL) initialisieren =============================================
Config Com1 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Config Serialin = Buffered , Size = 4                       ' Buffer kostet wertvolles SRAM
Open "com1:" For Binary As #1
' Clear Serialin                                              ' Braucht man ohne Buffer auch nicht


' ===== 1Wire-Bus DS18S20 Temperatursensor ====================================
Config 1wire = Portd.4


' ===== Timer Initialisieren ==================================================
Config Timer0 = Timer , Prescale = 256                      ' Timer0 liefert die Messzeit (1sec)
On Ovf0 Tim0_isr

Config Timer1 = Counter , Edge = Falling , Prescale = 1     ' Timer1 zaehlt die Eingangstakte
On Ovf1 Tim1_isr

Enable Timer0                                               ' Timer starten
Enable Timer1                                               ' Timer starten

Waitms 100                                                  ' kleine Wartezeit

Print #1 , "Ready"                                          ' Startmeldung ueber UART senden

Waitms 100                                                  ' nochmal etwas warten

Temp = 1                                                    ' Flag Auf "Messung läuft nicht" setzen

' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do


  ' Damit man mit dem "Wait 1100" nicht unnoetig Zeit verbrennt habe ich das Messende nun ueber ein Flag
  ' anzeigen lassen. Nun kann man waehrend der Messzeit auch noch was anderes machen.
  If Temp = 0 Then                                          ' Test ob die Messung zu Ende ist
    ' Die Messung laeuft noch

    ' Ischarwaiting(#1)

    ' inkey(#1)

    ' ===== Messungen ausschalten ===== Character "e" (ende)
    ' Disable Interrupts
    ' Temp = 0
    ' Senden "EE EE EE EE EE EE EE EE EE EE ...."

    ' ===== Messungen einschalten ===== Character "a" (anfang)
    ' Gosub Ds18s20_mess                                      ' 1Wire Messung starten - der Chip arbeitet alleine weiter
    ' Senden "AA AA AA AA AA AA AA AA AA AA ...."
    ' Temp = 0                                                ' Temp als Flag nutzen : Messung noch nicht fertig
    ' ----- Frequenz-Messung starten -----
    ' Ticks = 0                                               ' Timer0-Ticks initialisieren
    ' Enable Interrupts                                       ' Interrupts für Frequenzmessung anschalten
    '                                                         ' Die Frequenzmessung sollte nach 1 sec beendet sein.
                                                             ' und damit die Interrupts auch wieder abgeschaltet (siehe ISR)
    '

  Else                                                      ' Frequenz-Messung ist zu Ende

    Gosub Ds18s20_temp                                      ' 1Wire Temperatur abfragen (vom letzten Messzyklus)
    Gosub Ds18s20_mess                                      ' 1Wire Messung starten - der Chip arbeitet alleine weiter

    ' Uebertragung der Daten ueber UART (1k2 8n1) im Binaerformat mit crlf (0D 0A) als Endmarke
    ' gesamt : 13 Byte => 26 Chr in Hex ... + Ende-Zeichen crlf (0d 0a)
    ' Daten des Temperatursensors (Scratchpad des DS18S20) ausgeben (9 Byte => 18Cht r in Hex)
    For Ds_count = 1 To 9
'      Printbin #1 , Ds18s20(ds_count);                      ' Scratchpad auf UART ausgeben
      Print #1 , Hex(ds18s20(ds_count));                    ' Scratchpad auf UART als HEX ausgeben
    Next

    ' 32Bit Frequenzmessung ausgeben (4 Byte => 8Chr in Hex)
    Temp = High(cnt_ovf)
'    Printbin #1 , Temp;                                     ' Frequenzmessung auf UART ausgeben (Bits 31-24)
    Print #1 , Hex(temp);                                   ' Frequenzmessung auf UART als HEX ausgeben (Bits 31-24)
    Temp = Low(cnt_ovf)
'    Printbin #1 , Temp;                                     ' Frequenzmessung auf UART ausgeben (Bits 23-16)
'    Printbin #1 , Cnt_hi ; Cnt_lo                           ' Frequenzmessung auf UART ausgeben (Bits 15-0)
    Print #1 , Hex(temp);                                   ' Frequenzmessung auf UART als HEX ausgeben (Bits 23-16)
    Print #1 , Hex(cnt_hi) ; Hex(cnt_lo)                    ' Frequenzmessung auf UART als HEX ausgeben (Bits 15-0)

    Temp = 0                                                ' Temp als Flag nutzen : Messung noch nicht fertig
    ' ----- Frequenz-Messung starten -----
    Ticks = 0                                               ' Timer0-Ticks initialisieren
    Enable Interrupts                                       ' Interrupts für Frequenzmessung anschalten
    ' Waitms 1100                                             ' Die Frequenzmessung sollte nach 1,1sec beendet sein.
                                                             ' und damit die Interrupts auch wieder abgeschaltet (siehe ISR)
  End If


Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################




' ============================================
' ===== Sub fuer DS18S20 Messung starten =====
' ============================================
Ds18s20_mess:
  ' ===== Befehlsbytes =====
  ' SEARCH ROM [F0h]
  ' READ ROM [33h]
  ' MATCH ROM [55h]
  ' SKIP ROM [CCh]
  ' ALARM SEARCH [ECh]
  ' CONVERT T [44h]
  ' WRITE SCRATCHPAD [4Eh]
  ' READ SCRATCHPAD [BEh]
  ' COPY SCRATCHPAD [48h]
  ' RECALL E2 [B8h]
  ' READ POWER SUPPLY [B4h]
  1wreset                                                   ' 1Wire-Bus zuruecksetzen
  1wwrite &HCC                                              ' Alle 1Wire-Devices ansprechen
  1wwrite &H44                                              ' Temperaturmessung starten
Return




' ================================================
' ===== Sub fuer DS18S20 Temperatur einlesen =====
' ================================================
Ds18s20_temp:
  ' ===== Scratchpad =====
  ' 1. Byte 0 - Temperature LSB
  ' 2. Byte 1 - Temperature MSB
  ' 3. Byte 2 - TH Register or User Byte 1 <-> TH Register or User Byte 1
  ' 4. Byte 3 - TL Register or User Byte 2 <-> TL Register or User Byte 2
  ' 5. Byte 4 - Reserved (FFh)
  ' 6. Byte 5 - Reserved (FFh)
  ' 7. Byte 6 - COUNT REMAIN
  ' 8. Byte 7 - COUNT PER deg
  ' 9. Byte 8 - CRC8
  ' ===== Seriennummer / ROM-Code =====
  ' 8-BIT CRC , 48-BIT SERIAL NUMBER , 8-BIT FAMILY CODE (10h)
  ' ===== Temperaturberechnung =====
  ' After reading the scratchpad, the TEMP_READ value is obtained
  ' by truncating the 0.5°C bit (bit 0) from the temperature data
  ' TEMPERATURE = TEMP_READ - 0,25 + ( COUNT_PER_C - COUNT_REMAIN ) / COUNT_PER_C
  '
  1wreset                                                   ' 1Wire-Bus zuruecksetzen
  1wwrite &HCC                                              ' Alle 1Wire-Devices ansprechen
  1wwrite &HBE                                              ' Scratchpad einlesen

  Ds18s20(1) = 1wread(9)                                    ' diese Version spart etwas Flash (85% zu 87%)
'  For Ds_count = 1 To 9
'    Ds18s20(ds_count) = 1wread()                            ' Scratchpad in Array uebertragen
'  Next

  ' die naechsten 4 Zeilen brauch ich eigentlich nicht wenn ich sowieso immer das ganze Scratchpad sende
  ' dann kann auch der empfangende ATmega die CRC pruefen.
  If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then                 ' Wenn CRC8 korrekt dann Temperaturwerte sichern
    Deg_lo = Ds18s20(1)                                     ' Temperatur LSB
    Deg_hi = Ds18s20(2)                                     ' Temperatur MSB
  End If

Return




' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist das Gate fuer die Frequenzmessung
Tim0_isr:
  Timer0 = 178                                              ' Initialisierung fuer 1ms Takt (Prescaler 256)
  Incr Ticks                                                ' 1ms-Ticks zaehlen
  If Ticks = 1 Then                                         ' beim ersten Tick ...
    Timer1 = 0                                              ' Timer1 fuer Taktzaehlung initialisieren
    T1ovf = 0                                               ' und Timer1-Ueberlaufszaehler auf 0
  End If
  If Ticks = 1001 Then                                      ' 1sec Messzeit ist vorbei -> Werte sichern
    Cnt_lo = Tcnt1l                                         ' Frequenz LSB (Byte 1)   - Timer1 LowByte
    Cnt_hi = Tcnt1h                                         ' Frequenz     (Byte 2)   - Timer1 HighByte
    Cnt_ovf = T1ovf                                         ' Frequenz MSW (Byte 3+4) - Timer1-Ueberlaufszaehler
    Disable Interrupts
    Temp = 1                                                ' Temp als Flag nutzen : Messung ist jetzt fertig
  End If
Return




' ================================================
' ===== ISR fuer Timer1 Overflow =================
' ================================================
' Timer1 ist der Zaehler fuer die Frequenzmessung
Tim1_isr:
  Incr T1ovf                                                ' Ueberlauf vom 16Bit-Timer (Byte3+4) bearbeiten
Return




' ###############################################
' ##### Programm Ende ###########################
' ###############################################
Close #1
End

' - - - - - - - - - - - - - - - - S C H L U S S - - - - - - - - - - - - - - - - - - -

Der Code ist programmiert und läuft ;)

Gruß und gute Nacht
Dino
 
:p :cool:
Der Datenstrom wird über Komma von den auszugebenden Werten abgetrennt.


Hallo Dino!

Der Datenstrom wird was? :hmmmm:
Es hat mich ja mal interessiert und darum habe ich deinen Code bei mir mal kompiliert.......
und es kam genau die Fehlermeldung die ich erwartet hatte:
Fehlermeldung_Dinos_Zisterne.gif

Wie hast du das Programm denn bei dir fehlerfrei kompiliert bekommen?


Grüße,
Cassio
 
Hallo,

also zuerst mal das Ergebnis der Sensorbaugruppe (1200 Baud, 8Bit, keine Parität, 1 Stopbit) ...
Code:
   __LSB
 //  __MSB       __CntRemain
|| //          //  __Cnt/deg
||||          || //  __CRC
llmm uuuuffff |||| cc  _________Freq       
AA00 4B46FFFF 0C10 87 DBD9E53F
3200 4B46FFFF 0E10 FA 00045946
3200 4B46FFFF 0E10 FA 000459EB
3200 4B46FFFF 0D10 AF 000459E4
3200 4B46FFFF 0D10 AF 000459DF
3200 4B46FFFF 0D10 AF 000459DD
Ready
AA00 4B46FFFF 0C10 87 000459DD
3200 4B46FFFF 0D10 AF 0004576F
3200 4B46FFFF 0D10 AF 000459E0
3200 4B46FFFF 0D10 AF 000459DA
3200 4B46FFFF 0D10 AF 000459D6
3200 4B46FFFF 0C10 6B 000459D4
3200 4B46FFFF 0C10 6B 000459D2
3200 4B46FFFF 0C10 6B 000459CF
3200 4B46FFFF 0C10 6B 000459CD
3200 4B46FFFF 0C10 6B 000459CA
3200 4B46FFFF 0B10 05 000459C9
3200 4B46FFFF 0B10 05 000459C6
3200 4B46FFFF 0B10 05 000459C6
3200 4B46FFFF 0B10 05 000459C6
3200 4B46FFFF 0B10 05 000459C6
3200 4B46FFFF 0B10 05 000459C5
3200 4B46FFFF 0B10 05 000459C4
3200 4B46FFFF 0A10 C1 000459C2
3200 4B46FFFF 0A10 C1 00045997
3200 4B46FFFF 0A10 C1 0004373E
3200 4B46FFFF 0A10 C1 0003F6F2
3200 4B46FFFF 0A10 C1 0003E7A9
3200 4B46FFFF 0A10 C1 0003E462
3200 4B46FFFF 0A10 C1 0003E2EA
Normalerweise sind die Zeilen ohne Leerzeichen dazwischen. Ich hab mit nem Editor mal welche eingefügt um es etwas lesbarer zu machen :rolleyes:

Bei mir sieht es so aus ...
NoErrorsFound.png

Der Datenstrom wird was? :hmmmm:
Es hat mich ja mal interessiert und darum habe ich deinen Code bei mir mal kompiliert.......
und es kam genau die Fehlermeldung die ich erwartet hatte:
Anhang anzeigen 4590

Wie hast du das Programm denn bei dir fehlerfrei kompiliert bekommen?
Tja ...
Also Datenstrom ist ja das #1 (der erste "Stream" ... nannte man damals so. #2 wäre der Stream2)
Und wie ich es kompiliert habe ... einfach auf Compile geklickt. Ich weiß auch nicht warum er bei dir motzt.
Bei mir läuft es wie im Screenshot zu sehen fehlerfrei.

Der Fehler bei dir mit dem "Non Numeric Character DS_Count" sieht nach ner falschen Variablendeclaration aus.
Bei mir steht ja am Anfang sowas ...
Code:
' ####################################
' ##### DEFINITION DER VARIABLEN #####
' ####################################
'
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9)[B][COLOR=#FF0000] As Byte [/COLOR][/B]                                     ' Array fuer Scratchpad

' Variablen fuer DS18S20 Temperatur
Dim Ds_count[B][COLOR=#FF0000] As Byte[/COLOR][/B]                                        ' Zaehler fuer Scratchpad bearbeiten                                 '
Dim Deg_lo As Byte                                          ' unteres Temperaturbyte
Dim Deg_hi As Byte                                          ' oberes Temperaturbyte
Also beides Byte. Es sollte also passen.
Ich nehme auch mal an das du wirklich den gesamten Quellcode im Bascom hast und beim Copy/Paste nichts verloren gegangen ist.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)