Seite 9 von 11
Re: Propeller in 19"
Verfasst: Mo 14. Jul 2014, 21:33
von PIC18F2550
Das ist das Grundgerüst um Daten(0+16Bit) und Commandos(1+16Bit) auf dem BUS zu Bringen.
Beide Commandos sind grundsätzlich 17Bit breit es unterscheidet sie nur das 17. Bit
Code: Alles auswählen
' ======================================================================================
' SUBROUTINEN : word auf BUS schreiben
' ======================================================================================
BUS_write_w waitpeq IORQ_QT, IORQ_QT ' warten bis QT == 1
or dira, IORQ_C_io_w ' BUS auf Ausgabe schalten
rdlong temp1, db2A ' 16Bit Word holen
and temp1, M_16Bit ' 16Bit auswählen
jmp #BUS_write_w_1
' ======================================================================================
' SUBROUTINEN : COMANDO auf BUS schreiben
' ======================================================================================
BUS_write_c waitpeq IORQ_QT, IORQ_QT ' warten bis QT == 1
or dira, IORQ_C_io_w ' BUS auf Ausgabe schalten
rdlong temp1, db2A ' 16Bit Word holen
and temp1, M_17Bit ' 16Bit auswählen
BUS_write_w_1 andn outa, M_17Bit ' BUS auf $0000 setzen
or outa, temp1 ' einzen setzen
andn outa, IORQ_WR ' Schreibbefehl ausgeben
waitpeq zero, IORQ_QT ' warten bis QT == 0
or outa, IORQ_WR ' Schreibbefehl zurücknehmen
waitpeq IORQ_QT, IORQ_QT ' warten bis QT == 1
andn dira, IORQ_C_io_w ' BUS Ausgabe aufheben
wrlong cogidm, statusA ' Commando löschen
andn outa, M_17Bit ' BUS auf $0000 setzen
BUS_write_w_ret
BUS_write_c_ret ret

jetzt breuchte ich langsam mal meine VGA-Karte

Re: Propeller in 19"
Verfasst: Mo 14. Jul 2014, 22:54
von kuroneko
PIC18F2550 hat geschrieben:Code: Alles auswählen
rdlong temp1, db2A ' 16Bit Word holen
and temp1, M_16Bit ' 16Bit auswählen
Warum nimmst Du nicht einfach
rdword? Oder ist es in Wirklichkeit ein verschobener 32bit Wert? Was nichts daran aendert das selbiger schon maskiert sein sollte.
Und ich wuerde den Wert for dem
waitpxx lesen.
Re: Propeller in 19"
Verfasst: Di 15. Jul 2014, 08:10
von PIC18F2550
Wie immer hast du recht.
Ich hab mich von der Festlegung das 4 long Werte im hRAM für die Übertragung der Parrameter zuszändig sind blenden lassen.
Das vorher lesen minimiert natürlich die Busauslastung und währe da auch angebracht.
Danke was würde ich nur ohne Dich machen.

Re: Propeller in 19"
Verfasst: Mi 16. Jul 2014, 19:59
von PIC18F2550
Ohne VGA ist's mühselig was zu stricken.
Also hab ich mal ein bisschen mit dem PCA9555D rumgespielt.
Als Treiber wurde natürlich wieder ein PASM model assimiliert.
Der 1. Test bestand darin die Config einzulesen.
Erstmal mit SPIN angesprochen und kein Blockmodus.
Code: Alles auswählen
CON
scl = 28
sda = 29
i2c_freq = 100_000
OBJ
i2c : "I2C"
pst : "PST"
pub main|adr,sadr,a,mee,zei,com,wer, ack
pst.start(115200)
pst.Clear(0)
pst.Position(0,0)
pst.Str(@T000)
pst.Position(0,1)
pst.hex(i2c.init(scl,sda,100_000),2)
repeat
pst.Position(0,1)
ack := 0
repeat until ack == 1
i2c.start
ack := i2c.write_byte($40)
ack := i2c.write_byte(1)
ack := 0
repeat until ack == 1
i2c.start
ack := i2c.write_byte($41)
pst.bin(i2c.read_byte(FALSE),8)
i2c.stop
pst.Str(@T003)
ack := 0
repeat until ack == 1
i2c.start
ack := i2c.write_byte($40)
ack := i2c.write_byte(0)
ack := 0
repeat until ack == 1
i2c.start
ack := i2c.write_byte($41)
pst.bin(i2c.read_byte(FALSE),8)
i2c.stop
repeat 3000

- Bildschirmfoto-SimpleIDE Terminal-2.png (11.63 KiB) 12458 mal betrachtet
von links nach rechts
3 Bit für die Treibernummer wenn eine Karte mehrfach verbaut wurde. Karte 0 bis 7
8 Bit Nummer zur Karten identifizierung 0-255
3 Bit Steckplatznummer wird nur für den Bootloader benötigt
2 Bit Ausgang für rot/grün LED werden gegen 0V geschaltet daher hier als 1
Jetzt muss ich das Prinzip in PASM umschreiben mal sehen wie das klappt.
Re: Propeller in 19"
Verfasst: Mi 16. Jul 2014, 20:13
von PIC18F2550
Ich konnte es nicht lassen und habe gleich mal noch die Ansteuerung der LED's ausprobiert und Es geht.
Code: Alles auswählen
' config
ack := 0
repeat until ack == 1
i2c.start
ack := i2c.write_byte($40)
ack := i2c.write_byte(6)
ack := i2c.write_byte(%11111100)
i2c.stop
' schreiben
ack := 0
repeat until ack == 1
i2c.start
ack := i2c.write_byte($40)
ack := i2c.write_byte(2)
ack := i2c.write_byte(%00000011)
i2c.stop
<EDIT> So die Ansteuerung der LEDs ist jetzt auch in PASM.</EDIT>
Re: Propeller in 19"
Verfasst: Fr 18. Jul 2014, 23:48
von PIC18F2550
Re: Propeller in 19"
Verfasst: Sa 19. Jul 2014, 13:03
von PIC18F2550
Sie Commandoauswertung wurde um eine Fehlererkennung erweitert.
Alle Befehle die größer als $1F sind bewirken das Stoppen der COG aktivitäten. (zur Fehlersuche)
Gleichzeitig signalisiert die rote LED an der Karte durch einen impuls (1/4) den Fehler.
Code: Alles auswählen
0530(0146) | There are 170 ($0AA) Longs left in the cog
Re: Propeller in 19"
Verfasst: So 20. Jul 2014, 16:34
von PIC18F2550
Das Auslesen der Karten information über den PCA9555D ist erfolgreich verlaufen.
Funktionsaufruf in SPIN
Code: Alles auswählen
PUB read_config(a):b
byte[$7FFF]:=$17 'Testvorbereitung
repeat until byte[$7FFF]==$0
b:=long[$7FF8]
So sieht die dementsprechende Routine in PASM aus
Code: Alles auswählen
' ======================================================================================
' SUBROUTINEN : I²C PCA9555 Config von Karte lesen
' ======================================================================================
I2C_PCA_read_c call #I2C_start_c
mov data, I2C_PCA9555D_w ' write Adresse
I2C_PCA_read_c_M1 call #I2C_write
cmp ack_, #$1 wz '
if_nz jmp #I2C_PCA_read_c_M1
mov data, #$1 ' write To outport
I2C_PCA_read_c_M2 call #I2C_write
cmp ack_, #$1 wz '
if_nz jmp #I2C_PCA_read_c_M2
call #I2C_start_c
mov data, I2C_PCA9555D_r ' read Adresse
I2C_PCA_read_c_M3 call #I2C_write
cmp ack_, #$1 wz '
if_nz jmp #I2C_PCA_read_c_M3
or flags_, #ack_flag
call #I2C_read
shl data, #$8
mov temp1, data
andn flags_, #ack_flag
call #I2C_read
add data, temp1
call #I2C_stop_c
wrlong data, db1A
I2C_PCA_read_c_ret ret
Re: Propeller in 19"
Verfasst: So 20. Jul 2014, 16:57
von PIC18F2550
Der Start des IO_Moduls wurde um folgende Funktionen erweitert:
- Rücksetzen der LED Anzeige und aktivierung der grünen LED zur Bereitschaftsanzeige
Code: Alles auswählen
' ======================================================================================
' ROUTINE : Initalisierung
' ======================================================================================
io_driver cogid cogidm
add cogidm, #$1
wrbyte cogidm, cog ' COGID Speichern
call #I2C_PCA_init
call #I2C_PCA_ledrg_00_c
call #I2C_PCA_ledrg_x1_c
- Einfügen einer I2C-Bus-Rest Funktion einfachhalber bei der PCA9555D initalisierung.
Code: Alles auswählen
' ======================================================================================
' SUBROUTINEN : I²C PCA9555 initalisieren
' ======================================================================================
I2C_PCA_init mov q_freq, I2C_400
mov temp1, #$9 ' 9X stop um alle Busteilnehmer zu reseten
I2C_PCA_init_1 call #I2C_stop_c
djnz temp1, #I2C_PCA_init_1
call #I2C_start_c
mov data, I2C_PCA9555D_w ' write Adresse
I2C_PCA_init_2 call #I2C_write
cmp ack_, #$1 wz '
if_nz jmp #I2C_PCA_init_2
mov data, #$6 ' write To Controlregister IN/OUT Mask
call #I2C_write
mov data, #%11111100 ' write 6xIN/2xOUT Mask
call #I2C_write
call #I2C_stop_c
I2C_PCA_init_ret ret

Die VGA ist DA
Re: Propeller in 19"
Verfasst: So 20. Jul 2014, 21:36
von PIC18F2550
Im Garten kommen immer wieder neue Gedanken wie Unkraut.
Warum nicht gleich die Errorroutine zur Fehleranzeige Nutzen.
Code: Alles auswählen
' ======================================================================================
' ERROR-Codes
' ======================================================================================
' Fehler nichts löschen nur LED Meldung
ERROR_ long 0
ERROR_3_c add ERROR_, #$1 ' Wordformat Adressfehler(Ungerade Adresse)
ERROR_2_c add ERROR_, #$1 ' Befehl indexüberschreitung $0..$1F
ERROR_1_c add ERROR_, #$1 ' Reservebefehl
ERROR_LOOP mov temp2, ERROR_
call #I2C_PCA_ledrg_00_c
mov temp1, #$1
shl temp1, #24
ERROR_c_M1 djnz temp1, #ERROR_c_M1 wz
ERROR_c_M2 call #I2C_PCA_ledrg_1x_c
mov temp1, #$1
shl temp1, #21
ERROR_c_M3 djnz temp1, #ERROR_c_M3 wz
call #I2C_PCA_ledrg_00_c
mov temp1, #$1
shl temp1, #22
ERROR_c_M4 djnz temp1, #ERROR_c_M4 wz
djnz temp2, #ERROR_c_M2 wz
jmp #ERROR_LOOP ' BEI FEHLER SYSTEM ZUR ANALYSE STOPPEN