Sooo habsch selber herausgefunden! \/
Also: in der obrigen Formel bekomme ich für 10101011 (171/256)*5=3,33V heraus und daraus folgt:
1. gewünschte Spannung: 3,25/5=0,56
2. mit 256 multiplizieren und danach runden oder alles mit dem Windowsrechner rechnen => dort kann man sich gleich das Ergebnis in HEX oder BIN umwandeln lassen
3. kompilieren und es stimmt...fast
Bei mir lese ich mit einem Multimeter 3,23V und nach Wandlung mit dem Chip 3,248V, was will man(n) mehr
Code:
'**********************************************************
'Programm : I2C-Ansteuerung PCF8591
'By : mat-sche@web.de
'Compiler : BASCOM-AVR 1.11.9.1
'Hardware : Mega läuft als Master holt
' Daten über I2C vom ADC
'
'Board : kleines
'Chip type : MEGA32
'**********************************************************
$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 150 ' default use 32 for the hardware stack
$swstack = 150 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$sim
$lib "i2c_twi.lbx"
'-----------------2x16 LCD Display an Port c =>Conector -------------------------------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 ' Pinbelegung "LCD-Port)"
' SV8 6 5 4 3 7 8 ' Pinbelegung SV9 Board
Config Lcd = 16 * 2
Config Porta = Output
Config Lcdbus = 4
Initlcd
Print "Start"
Cursor Off Noblink ' Cursor und Blinken abschalten.
Cls
'------------------------------------------------------------------------------- Config TWI
Config Twi = 100000 ' Init TWBR und TWSR
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen
Config Sda = Portc.1 'SDA und SCL als Hardware-TWI definieren
Config Scl = Portc.0
Const Pcf8591write = &H90 'PCF TWI Adresse zum schreiben des Controlbyts
Const Pcf8574read = &H91 'PCF TWI Adresse zum Auslesen der Datenbyts
Ddra = &B00000000 ' PortA wird als Eingang verschalten
'------------------------------------------------------------------------------- Config Variablen
Dim U_wert As Single ' Variablen
Dim Dat As Byte
Dim Lcd_text As String * 5
'------------------------------------------------------------------------------- Config Controllbyte PCF
I2cstart
I2cwbyte Pcf8591write 'Schreibadresse senden
I2cwbyte &B00000000 'Kontrollbyte
'1. immer null
'2. 1= Analog Out enable '
'3-4. Messwahl: 00= single input; 01= 3 differential input; 10= kanal 0&1= single end, kanal 2&3= differential; 11= 2 differntial inputs
'5.immer null
'6. 1= Autoincrement Flag an (nach jedem Acknowled wird eine Wandlung vom nächsten Kanalangestoßen)
'7-8.A/D Kanalnummer: 00=cha0; 01=cha1; 10=cha2; 11=cha3
I2cstop 'TWI Übertragung abgeschlossen
Do
'------------------------------------------------------------------------------- A/D Kanal 0 auslesen nach Tastendruck
If Pina.7 = 1 Then 'nach jeden Tastendruck PCF8591 Analogwert auslesen
I2cstart
I2cwbyte Pcf8574read ' Leseadresse übermitteln
I2crbyte Dat , Ack 'Dummy => benötigt da ja nach jedem Ack erst die vorhergehende Wandlung gesendet wird; Ack bedeutet dass noch weitere Datenbyts abgefragt werden
I2crbyte Dat , Nack 'Messwert von kanal0, Nack=> es wird kein weiteres Datenbyte abgefragt
I2cstop '
Print " Wertdat = " ; Dat
Print Err 'TWI übermittlung OK? 1= nein, 0= i.O.
End If
U_wert = Dat * 5
U_wert = U_wert \ 254
Lcd_text = Fusing(u_wert , "#.###") 'FUSING returns a formatted string of a single value.
'Cls
Locate 1 , 1
Lcd " U-Wert " ; Lcd_text
Locate 2 , 1
Lcd " Wert_Dat= " ; Dat
'------------------------------------------------------------------------------- D/A Kanal Spannung ausgeben auf Tastendruck
If Pina.6 = 1 Then
I2cstart
I2cwbyte Pcf8591write 'Schreibadresse senden
I2cwbyte &B01000000 'Kontrollbyte
'1. immer null
'2. 1= Analog Out enable '
'3-4. Messwahl: 00= single input; 01= 3 differential input; 10= kanal 0&1= single end, kanal 2&3= differential; 11= 2 differntial inputs
'5.immer null
'6. 1= Autoincrement Flag an (nach jedem Acknowled wird eine Wandlung vom nächsten Kanalangestoßen)
'7-8.A/D Kanalnummer: 00=cha0; 01=cha1; 10=cha2; 11=cha3
I2cwbyte &HA6 , Nack
I2cstop
End If
Loop
End
MAT
Lesezeichen