PWM chip PCA9685 életre keltése Bascom-ban

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Tom2tom
DrótVégénSzéndarab
Hozzászólások: 34
Csatlakozott: 2008. december 22. hétfő, 7:00

PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: Tom2tom »

Sziasztok,

Terepasztal világítás vezérléshez szeretném használni a fent nevezett CHIP-et.
Arduino-val szóra tudom bírni, teszi szépen a dolgát.
Viszont valami oknál fogva Bascom alól nem akar menni.

A NYÁK és egyéb áramkör oldalon elvileg nincs gond. Ugyanis egy I/O Expandert (MCP 23017) szépen meg tudok hajtani I2C-n keresztül. ATMega8A-t használok.

Valószínűleg a kóddal van a gond.
Találtam a neten egy mintakódot, de már azzal sem működik.
Kérem segítsetek a problémamegoldásban ha van időtök és kedvetek.

LED1-et szeretném meghajtani

Mintakód:
https://www.mcselec.com/index.php//musi ... 869ba3facf

Saját kód:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 8000000

Config Sda = Portd.5
Config Scl = Portd.6
Config I2cdelay = 2
I2cinit

'slave write address
'Const Address_io_w = 130
Const Address_io_w = &H82
'Const Address_io_w = &H41
'slave read address
'Const Address_io_r = 131
Const Pca9685m1 = &H00                                      ' Register Adress Mode 1
Const Pca9685m2 = &H01                                      ' Register Adress Mode 2

'Reset device
 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte &H00
 I2cwbyte &H01
 I2cstop
 Waitms 10

' Set MODE 1
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m1
I2cwbyte &H81                                               ' PCA Responds to Led All Call  and Restart enabled
I2cwbyte &HA1                                               ' enable auto increment
I2cstop

' Set MODE 2
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m2
I2cwbyte &H10                                               ' Set the output pin mode (direct to led)
I2cstop

'Do

 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte &H0A
 I2cwbyte 100
 I2cstop

 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte &H0B
 I2cwbyte 0
 I2cstop

 Wait 2

'Loop

End
Köszönettel, Tamás (42)
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: kapu48 »

Kérjük a működő Arduinos kód linkjét!
Hogy összehasonlíthassuk, hátha rájövünk mi a különbség.
Ami miatt nem működik a kódod.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: kapu48 »

Ami elsőre feltűnt, hogy nagyra állítottad az IIC órajelét (2?)!
Az ajánlott értékek:

Kód: Egész kijelölése

Config I2cdelay = 400000              ' Supported baud rates are 100kHz, 400kHz, and 1000kHz
Avatar
Tom2tom
DrótVégénSzéndarab
Hozzászólások: 34
Csatlakozott: 2008. december 22. hétfő, 7:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: Tom2tom »

Próbáltam az eredetivel is "400000", de sajnos azzal sem ment :(
Ott van a link a saját kód felett.
A Bascom help menüben ide 1 és 255 közötti számot javasol. "A numeric value in the range from 1 to 255. A higher value means a slower I2C clock."
Sajnos jelenleg azt sem tudom, hogy az IIC jellel van-e a gond, vagy magával az IIC parancsokkal.

Arduinoval ezt használom és működik:

Kód: Egész kijelölése

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
// you can also call it with a different address and I2C interface
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(&Wire, 0x41);
uint8_t p=1;

void setup() {
  Serial.begin(9600);
  Serial.println("GPIO test!");

  pwm.begin();
  pwm.setPWMFreq(1000);  // Set to whatever you like, we don't use it in this demo!

  // if you want to really speed stuff up, you can go into 'fast 400khz I2C' mode
  // some i2c devices dont like this so much so if you're sharing the bus, watch
  // out for this!
  Wire.setClock(400000);
}

void loop() {
  for (int a=0; a<255; a=a+5) {
    pwm.setPWM(p, 0, a);
    delay(50);
  }
  for (int a=255; a>5; a=a-5) {
    pwm.setPWM(p, 0, a);
    delay(50);
  }
}
Próbáltam visszafejteni az Arduino library-t de az az út sem egyszerű.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: kapu48 »

Próbáld futatni ezt, i2c scanner:

Kód: Egész kijelölése

Dim Adress_loop As Byte                                 
    Print  "i2c  "; 
    For Adress_loop = 2 To 254 Step 2                        'Scan every even address 
       I2cstart                                              'setup i2c bus 
       I2cwbyte Adress_loop                                  'get result 
       If Err = 0 Then                                       'err=hw problem 
          Print Adress_loop ; "," ;                     'no error so device 
       End If                                                'exits 
       I2cstop                                               'stop bus 
    Next Adress_loop                                         'loop through each sensor 
    Print  "" 
 
Avatar
Tom2tom
DrótVégénSzéndarab
Hozzászólások: 34
Csatlakozott: 2008. december 22. hétfő, 7:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: Tom2tom »

Először is B.Ú.É.K.!
Másodszor, köszönöm az eddigi válaszokat.

Ezt az üzenetet kaptam a mintakódra "i2c 14,130,"
A 130-nak gondolom örülnöm kell, de mit jelent a 14-es cím?
Avatar
Tom2tom
DrótVégénSzéndarab
Hozzászólások: 34
Csatlakozott: 2008. december 22. hétfő, 7:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: Tom2tom »

Köszönöm a segítséget.
Az I2C scanner és az alsábbi kód segített meggyőződni az I2C kommunikáció meglétéről.
Már csak a jó beállításokat kell elvégeznem, hogy a PWM rész is működjön.
Ha sikerült, akkor becsatolom ide a fórumba, hogy másnak is hasznos legyen.

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 8000000

$baud = 19200
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space


Config Sda = Portd.5
Config Scl = Portd.6
'Config I2cdelay = 400000
Config I2cdelay = 200
I2cinit

Enable Interrupts

'slave write address
Const Address_io_w = 130
'slave read address
Const Address_io_r = 131

Const Pca9685m1 = &H00                                      ' Register Adress Mode 1
Const Pca9685m2 = &H01                                      ' Register Adress Mode 2

Dim B1 As Byte
Dim B2 As Byte
Dim S As String * 10

Print ""
Print "Reset device"
'Reset device
 I2cstart
 I2cwbyte &H00
 I2cwbyte &H06
 I2cstop
 Waitms 100

B1 = 1
B2 = 2

Print "Read default settings"
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m1                                          ' Register Adress Mode 1
I2cstart
I2cwbyte Address_io_r
I2crbyte B1 , Nack
I2cstop

I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m2                                          ' Register Adress Mode 2
I2cstart
I2cwbyte Address_io_r
I2crbyte B2 , Nack
I2cstop

S = "B1--"
S = Str(b1)
Print "B1= " ; S;
Print " -- " ;
S = "B2--"
S = Str(b2)
Print "B2= " ;
Print S

Print "Try to set Mode1 to h20 (32)"
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m1
I2cwbyte &H20
I2cstop

B1 = 1
B2 = 2
Print "Check the value of Mode1"
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m1
I2cstart
I2cwbyte Address_io_r
 I2crbyte B1 , Nack
I2cstop

S = "B1--"
S = Str(b1)
Print "B1= " ; S

Wait 2

Print "Try to set Mode2 to h10 (16)"
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m2
I2cwbyte &H10
I2cstop

B1 = 1
B2 = 2
Print "Check the value of Mode2"
I2cstart
I2cwbyte Address_io_w
I2cwbyte Pca9685m2
I2cstart
I2cwbyte Address_io_r
 I2crbyte B2 , Nack
I2cstop

S = "B2--"
S = Str(b2)
Print "B2= " ; S

Print "End of program"

End
A fenti kódra ezek a válaszok érkeznek:

Kód: Egész kijelölése

Reset device
Read default settings
B1= 17 -- B2= 4
Try to set Mode1 to h20 (32)
Check the value of Mode1
B1= 32
Try to set Mode2 to h10 (16)
Check the value of Mode2
B2= 16
End of program
Avatar
Tom2tom
DrótVégénSzéndarab
Hozzászólások: 34
Csatlakozott: 2008. december 22. hétfő, 7:00

Re: PWM chip PCA9685 életre keltése Bascom-ban

Hozzászólás Szerző: Tom2tom »

A működő kód :)
:D

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 8000000

$baud = 19200
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Config Sda = Portd.5
Config Scl = Portd.6
Config I2cdelay = 200
I2cinit

Enable Interrupts

Declare Sub Resetdevice
Declare Sub Readmodes
Declare Sub Setmode1(byval Bm1 As Byte)
Declare Sub Setmode2(byval Bm2 As Byte)

 'slave write address
Const Address_io_w = 130
'slave read address
Const Address_io_r = 131

Const Pca9685m1 = &H00                                      ' Register Adress Mode 1
Const Pca9685m2 = &H01                                      ' Register Adress Mode 2

Dim B1 As Byte
Dim B2 As Byte
Dim S As String * 10

Print ""
Print "Reset device"
Call Resetdevice
Call Readmodes

Print "Try to set Mode1 to h21 (33)"
Call Setmode1(&B00100001)
Call Readmodes

Print "Try to turn ON the LED_1"
I2cstart
I2cwbyte Address_io_w
I2cwbyte 10
I2cwbyte 255
I2cwbyte 1
I2cwbyte 255
I2cwbyte 11
I2cstop

Wait 2

Print "Try to turn OFF the LED_1"
I2cstart
I2cwbyte Address_io_w
I2cwbyte 10
I2cwbyte 0
I2cwbyte 0
I2cwbyte 0
I2cwbyte 0
I2cstop

Wait 2

Print "Try to turn ON a little the LED_1"
I2cstart
I2cwbyte Address_io_w
I2cwbyte 10
I2cwbyte 0
I2cwbyte 0
I2cwbyte 100
I2cwbyte 0
I2cstop

'Print "Try to set Mode2 to h10 (16)"
'Call Setmode2(&H10)

Print "End of program"

Do
 B1 = 1
 Wait 2
Loop

Sub Resetdevice
'Reset device
 I2cstart
 I2cwbyte &H00
 I2cwbyte &H06
 I2cstop
 Waitms 100
End Sub

Sub Readmodes
'Read Mode 1 and Mode 2 registers
 B1 = 1
 B2 = 2

 Print "Modes --> " ;
 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte Pca9685m1                                         ' Register Adress Mode 1
 I2cstart
 I2cwbyte Address_io_r
 I2crbyte B1 , Nack
 I2cstop

 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte Pca9685m2                                         ' Register Adress Mode 2
 I2cstart
 I2cwbyte Address_io_r
 I2crbyte B2 , Nack
 I2cstop

 S = "B1--"
 S = Str(b1)
 Print "B1= " ; S;
 Print " -- " ;
 S = "B2--"
 S = Str(b2)
 Print "B2= " ;
 Print S
End Sub

Sub Setmode1(byval Bm1 As Byte)
 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte Pca9685m1
 I2cwbyte Bm1
 I2cstop
End Sub

Sub Setmode2(byval Bm2 As Byte)
 I2cstart
 I2cwbyte Address_io_w
 I2cwbyte Pca9685m2
 I2cwbyte Bm2
 I2cstop
End Sub

End
Válasz küldése