Hallo CO-ers,

Ik wil graag een print met 4 7-segment displays en een SAA1064 chip.

Ik heb op dit forum gelezen dat PICBASIC softwarematige i2c kan, maar, ik kom er niet uit, hoe ik getallen op het schermpje kan laten verschijnen.

Mijn poging:


Device 16F628                ;Gebruik een 16F628 type
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
PORTB_PULLUPS On    ;pullups aan
 Dim VAR1 As Byte                     ' We'll only read 8-bits
 Dim Address As Word                  ' 16-bit address required
 Symbol Control = %11111000           ' Target an eeprom
 Symbol SDA = PORTB.5           ' Alias the SDA (Data) line
 Symbol SCL = PORTB.4           ' Alias the SSL (Clock) line 
 Address = 70                         ' Write to address 20
 VAR1 = 200                           ' The value place into address 20
 I2COUT SDA, SCL, Control , Address , [ VAR1 ]  ' Send the byte to the eeprom
 DelayMS 10                           ' Allow time for allocation of byte
End                           ;Einde programma

Heb alleen een voorbeeldje in CCS-C
Mischien heb je daar iets aan

Dit geeft een teller tot 9999

#include <18F4620.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOBROWNOUT,NOPUT,NOLVP,DEBUG,NOSTVREN,NOPROTECT

#include <saa1064_onboard.h>

#define MAX_NUMBER_TO_DISPLAY 9999

void main() {
int16 j;

for(j=0;j<=MAX_NUMBER_TO_DISPLAY;j++) {
saa1064_write_num(ADDR0,CTRL_DYNAMIC+CTRL_BLANK13+CTRL_BLANK24+CTRL_ADD3MA,j);
delay_ms(100);
}
}

#ifndef SAA1064_SDA

#define SAA1064_SDA PIN_C4
#define SAA1064_SCL PIN_C3

#endif

#use i2c(master,sda=SAA1064_SDA,scl=SAA1064_SCL,FORCE_HW)

// Write addresses set by connecting pin1 (ADR) to different voltages
#define ADDR0 0x70 // ADR to Vee
#define ADDR1 0x72 // ADR to 3/8 Vcc
#define ADDR2 0x74 // ADR to 5/8 Vcc
#define ADDR3 0x76 // ADR to Vcc

// Subaddressing
#define CONTROL_REG 0x00 // 00 = control register
#define DIGIT1 0x01 // 01 = digit 1
#define DIGIT2 0x02 // 02 = digit 2
#define DIGIT3 0x03 // 03 = digit 3
#define DIGIT4 0x04 // 04 = digit 4

// Control bits
#define CTRL_DYNAMIC 0x01 // C0 = 0 = static mode C0 = 1 dynamic mode
#define CTRL_BLANK13 0x02 // C1 = 0/1 digits 1 and 3 are blanked/not blanked
#define CTRL_BLANK24 0x04 // C2 = 0/1 digits 2 and 4 are blanked/not blanked
#define CTRL_TEST 0x08 // C3 = 1 all segments outputs turned on for segment test
#define CTRL_ADD3MA 0x10 // C4 = 1 adds 3ma to segment output
#define CTRL_ADD6MA 0x20 // C5 = 1 adds 6ma to segment output
#define CTRL_ADD12MA 0x40 // C6 = 1 adds 12ma to segment output

// Segment characters
#define SEGMENT_CHAR_BLANK 0x00 // Blank
#define SEGMENT_CHAR_DP 0x80 // Decimal point

// Segment table
byte const seg_table_saa1064[10] = {
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F }; // 0,1,2,3,4,5,6,7,8,9

void saa1064_write_num(int8 addr,int8 control,int16 num) {
int8 leading=true;
int8 led_data[4];
int8 digit;
int16 temp16;

for(digit=0;digit<3;digit++) {
temp16=num/10;
led_data[digit]=seg_table_saa1064[num-(temp16*10)];
num=temp16;
}
led_data[3]=seg_table_saa1064[num];

for(digit=3;digit>0;digit--) {
if(leading&&led_data[digit]==seg_table_saa1064[0])
led_data[digit]=SEGMENT_CHAR_BLANK;
else
leading=false;
}
i2c_start();
i2c_write(addr);
i2c_write(CONTROL_REG);
i2c_write(control);
for(digit=0;digit<=3;digit++)
i2c_write(led_data[digit]);
i2c_stop();
}

Bedankt, daar kan ik vast wel wat gegevens uit halen.

Iemand

Ikzelf gebruik voor I2C altijd de commando's Bstart, Bstop, Brestart, Busin en Busout. (Zie ook de help van Proton). Het moet ook kunnen met de commando's die je nu gebruikt, maar ik weet niet precies hoe die in elkaar zetten. Een site die je heel erg op weg kan helpen met I2C is Spency's PIC Basic.

Zie bijvoorbeeld:
http://www.digital-diy.net/16F%20Examples/DS1307.aspx

Arjo

Edit: Genereerd dat I2Cout commando zelf de Start en Stop condities? Anders zul je die waarschijnlijk moeten toevoegen.

[Bericht gewijzigd door Arjo op (13%)]