Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Kjell användes som referens för att försöka bilda sig en uppfattning av vilka varianter som spreds i stor mängd och faktiskt används, att någon har portat något innebär inte att det används..
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
OK, men titta på Electrokit istället för Kjell då. De har en sektion med kort från företaget Arduino, dvs "äkta" Arduinos om man nu vill kalla det så.
https://www.electrokit.com/produkt-kate ... duino-org/
https://www.electrokit.com/produkt-kate ... duino-org/
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Inte baserat på C++. Det är C++.
Main loop är bara funktioner från en header.
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Nej det är inte C++. Det är ett eget språk som transpilerar (översätter) till c++ och kompilerar med g++.
Sätt ett gäng arduinoprogrammerare framför en kompilator som strikt följer c++-standarden och majoriteten av dem kommer vara helt borta.
Det betyder ju dock inte att arduino är dåligt. Det är en bra starterplattform, men man ska vara medveten om begränsningarna och inlåsningseffekten.
Sätt ett gäng arduinoprogrammerare framför en kompilator som strikt följer c++-standarden och majoriteten av dem kommer vara helt borta.
Det betyder ju dock inte att arduino är dåligt. Det är en bra starterplattform, men man ska vara medveten om begränsningarna och inlåsningseffekten.
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Det är C++. Jag har själv skrivit om C++ bibliotek för Arduino till STM32 C kod.Mr Andersson skrev: ↑2 november 2020, 21:06:42 Nej det är inte C++. Det är ett eget språk som transpilerar (översätter) till c++ och kompilerar med g++.
Sätt ett gäng arduinoprogrammerare framför en kompilator som strikt följer c++-standarden och majoriteten av dem kommer vara helt borta.
Det betyder ju dock inte att arduino är dåligt. Det är en bra starterplattform, men man ska vara medveten om begränsningarna och inlåsningseffekten.
Hur som helst till övriga. Börjar på ett nytt kort. Mitt första kort blev lite dyrt. Detta blir billigare. Allt är nedsnålat. Bättre N-MOSFET på ca 45W också.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
C++ är ett objektorienterat språk och C är ett imperativt språk som saknar objektorientering. Hur brukar du lösa tillexempel klasser i C++ när du skriver om koden till C?
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Jag skriver objektorienterad C kod på det enkla sättet, utan att allokera minnet. Här är ett exempel på proffisionell C kod som är pedagogisk och helt utmärkt skrivet. Inte någon "AAAhhh jag ska köra allt i assembler bara för att vara cool"-attityd i C-koden.
Denna kod uppfyller:
En fråga till er övriga! Vad är SWIM? Är det samma som SWO?
Denna kod uppfyller:
- * Privata funktioner
* Deklerationer av objekt
* Arv
* Setters & Getters
En fråga till er övriga! Vad är SWIM? Är det samma som SWO?
Kod: Markera allt
//Include
#include "main.h"
#include "DS3231/DS3231.h"
// Structures
I2C_HandleTypeDef hi2c1;
DS3231_I2C DS_i2c;
// Init RTC - Set larm for: Week = false, Date = true and also the address 0x00
DS3231_init(&DS_i2c, &hi2c1, 0x0, false, true);
// Set the clock - Second 55. Hour 12. Day 5(Friday). Day of month 6. Month of year 3 (Mars). Year 2020.
DS3231_setClock(&DS_i2c, 55, 59, 12, 5, 6, 3, 20);
// Set alarm for the week - Minute 0. Hour 13. Day 5
DS3231_setWeekAlarm(&DS_i2c, 0, 13, 5);
// Sett alarm for the month
DS3231_setDateAlarm(&DS_i2c, 15, 0, 13, 6);
while(1){
// Get the time and the status of booth alarms
DS3231_getClock(&DS_i2c);
uint8_t status = DS3231_readALarmStatus(&DS_i2c);
char text2[50];
sprintf(text2, "HH:%d,MM:%d,SS:%d,S:%d", DS_i2c.hour, DS_i2c.minute, DS_i2c.second, status);
// Shut off the alarm with a trigg - It will start again when the time has come again
DS3231_offTriggAlarm(&DS_i2c);
}
Kod: Markera allt
#include "DS3231.h"
// Private functions
static void setAlarmSecond(DS3231_I2C* i2c, uint8_t seconds, uint8_t address);
static void setAlarmMinutes(DS3231_I2C* i2c, uint8_t minutes, uint8_t address);
static void setAlarmHours(DS3231_I2C* i2c, uint8_t hours, uint8_t address);
static void setAlarmDay(DS3231_I2C* i2c, uint8_t days, uint8_t address);
static void setAlarmDate(DS3231_I2C* i2c, uint8_t dates, uint8_t address);
/* Create the structure
* Address table:
* A2, A1, A0 = 000 = 0x0
* A2, A1, A0 = 001 = 0x1
* A2, A1, A0 = 010 = 0x2
* A2, A1, A0 = 011 = 0x3
* A2, A1, A0 = 100 = 0x4
* A2, A1, A0 = 101 = 0x5
* A2, A1, A0 = 110 = 0x6
* A2, A1, A0 = 111 = 0x7
*/
void DS3231_init(DS3231_I2C* i2c, I2C_HandleTypeDef* hi2c, uint8_t addr, uint8_t enableWeekAlarm, uint8_t enableDateAlarm){
i2c->addr = 0xD0 | (addr << 1);
i2c->hi2c = hi2c;
// Check if we have the correct connection with our RTC
if (HAL_I2C_IsDeviceReady(i2c->hi2c, i2c->addr, 10, 10) != HAL_OK){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // This MUST have GPIO PA5 ready to use - ERROR I2C - Wrong address
return;
}
// Set the control. Enable/disable the alarms and enable alarm output SQW
uint8_t pData[2] = {0x0E, 0x1C | (enableWeekAlarm << 1) | enableDateAlarm};
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
DS3231_offTriggAlarm(i2c);
}
/*
* Set the clock.
* Second:
* Variable second can be 0-59.
*
* Minute:
* Variable minutes can be 0-59.
*
* Hour:
* Variable hours can be 0-23.
*
* Day:
* Variable days can be 1-7.
*
* Date:
* Variable dates can be 1-31.
*
* Month:
* Variable months can be 1-12
*
* Year:
* Variable years can be 0-99
*/
void DS3231_setClock(DS3231_I2C* i2c, uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t days, uint8_t dates, uint8_t months, uint8_t years){
uint8_t pData[8];
pData[0] = 0x00; // Address for the first register
// Seconds
uint8_t ten = seconds/10; // This will result 0, 1, 2, 3, 4, 5
uint8_t part = seconds - ten*10; // This will result 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
pData[1] = (ten << 4) | part;
// Minutes
ten = minutes/10; // This will result 0, 1, 2, 3, 4, 5
part = minutes - ten*10; // This will result 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
pData[2] = (ten << 4) | part;
// Hours
ten = hours/10; // This will result 0, 1, 2.
part = hours - ten*10; // This will result 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
pData[3] = (ten << 4) | part;
// Day
pData[4] = days;
// Date
ten = dates/10; // This will result 0, 1, 2, 3.
part = dates - ten*10; // This will result 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
pData[5] = (ten << 4) | part;
// Month
ten = months/10;
part = months - ten*10;
pData[6] = (ten << 4) | part;
// Year
ten = years/10;
part = years - ten*10;
pData[7] = (ten << 4) | part;
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 8, 10);
}
void DS3231_getClock(DS3231_I2C* i2c){
uint8_t rData[7];
HAL_I2C_Mem_Read(i2c->hi2c, i2c->addr, 0x00, 1, rData, 7, 1000);
// Second
i2c->second = (10*(rData[0] >> 4)) + (rData[0] & 0xF);
i2c->minute = (10*(rData[1] >> 4)) + (rData[1] & 0xF);
i2c->hour = (10*(rData[2] >> 4)) + (rData[2] & 0xF); // 24-hour clock
i2c->day = rData[3];
i2c->date = (10*(rData[4] >> 4)) + (rData[4] & 0xF);
i2c->month = (10*(rData[5] >> 4)) + (rData[5] & 0xF);
i2c->year = (10*(rData[6] >> 4)) + (rData[6] & 0xF);
}
// Exactly the same as DS3231_setClock arguments.
void DS3231_setDateAlarm(DS3231_I2C* i2c, uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t dates){
setAlarmSecond(i2c, seconds, 0x07);
setAlarmMinutes(i2c, minutes, 0x08);
setAlarmHours(i2c, hours, 0x09);
setAlarmDate(i2c, dates, 0xA);
}
// Exactly the same as DS3231_setClock arguments.
void DS3231_setWeekAlarm(DS3231_I2C* i2c, uint8_t minutes, uint8_t hours, uint8_t days){
setAlarmMinutes(i2c, minutes, 0xB);
setAlarmHours(i2c, hours, 0xC);
setAlarmDay(i2c, days, 0xD);
}
// Un-Trigger of the alarm
void DS3231_offTriggAlarm(DS3231_I2C* i2c){
uint8_t pData[2] = {0x0F, 0b00000000};
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
}
// Read the alarm status. 0b11 = Both alarms are on. 0b1 = Only date alarm is on. 0b10 = Only week alarm is on
uint8_t DS3231_readALarmStatus(DS3231_I2C* i2c){
uint8_t rData = 0xF;
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, &rData, 1, 10);
HAL_I2C_Master_Receive(i2c->hi2c, i2c->addr, &rData, 1, 10);
rData = rData << 6;
rData = rData >> 6;
return rData; // We only want 11, 10, 01 or 00
}
static void setAlarmSecond(DS3231_I2C* i2c, uint8_t seconds, uint8_t address){
uint8_t ten = seconds/10;
uint8_t second = seconds - ten*10;
uint8_t pData[2] = {address, (ten << 4) | second};
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
}
static void setAlarmMinutes(DS3231_I2C* i2c, uint8_t minutes, uint8_t address){
uint8_t ten = minutes/10;
uint8_t minute = minutes - ten*10;
uint8_t pData[2] = {address, (ten << 4) | minute};
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
}
static void setAlarmHours(DS3231_I2C* i2c, uint8_t hours, uint8_t address){
uint8_t ten = hours/10;
uint8_t hour = hours - ten*10;
uint8_t pData[2];
pData[0] = address;
pData[1] = (ten << 4) | hour;
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
}
static void setAlarmDay(DS3231_I2C* i2c, uint8_t days, uint8_t address){
uint8_t ten = days/10;
uint8_t day = days - ten*10;
uint8_t pData[2] = {address, (1 << 6) | (ten << 4) | day};
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
}
static void setAlarmDate(DS3231_I2C* i2c, uint8_t dates, uint8_t address){
uint8_t ten = dates/10;
uint8_t date = dates - ten*10;
uint8_t pData[2] = {address, (ten << 4) | date};
HAL_I2C_Master_Transmit(i2c->hi2c, i2c->addr, pData, 2, 10);
}
Kod: Markera allt
#ifndef SRC_DS3231_DS3231_H_
#define SRC_DS3231_DS3231_H_
#include "main.h"
#include "stdbool.h"
typedef struct {
uint8_t addr; /* Address of the RTC */
I2C_HandleTypeDef *hi2c; /* Handler for the I2C */
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t day;
uint8_t date;
uint8_t month;
uint8_t year;
}DS3231_I2C;
void DS3231_init(DS3231_I2C* i2c, I2C_HandleTypeDef* hi2c, uint8_t addr,uint8_t enableWeekAlarm, uint8_t enableDateAlarm);
void DS3231_setClock(DS3231_I2C* i2c, uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t days, uint8_t dates, uint8_t months, uint8_t years);
void DS3231_getClock(DS3231_I2C* i2c);
void DS3231_setDateAlarm(DS3231_I2C* i2c, uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t dates);
void DS3231_setWeekAlarm(DS3231_I2C* i2c, uint8_t minutes, uint8_t hours, uint8_t days);
void DS3231_offTriggAlarm(DS3231_I2C* i2c);
uint8_t DS3231_readALarmStatus(DS3231_I2C* i2c);
#endif /* SRC_DS3231_DS3231_H_ */
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Det ser inte ut som objektorienterad kod, det är imperativ kod du skrivit.
Vet du vad objektorienterad programmering betyder?
Vet du vad imperativ programmering betyder?
Vet du vad objektorienterad programmering betyder?
Vet du vad imperativ programmering betyder?
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Det är objektorienterad, men den är skriven igenom att använda funktioner och strukturer. Varje struktur man deklarerar är alltså ett objekt. Sedan passerar man strukturen i varje funktion. På så sett så kan du återanvända funktionerna som de vore ett objekt.
Objektorientering handlar inte att man måste ha en specifik klass som liknar Java eller C++ eller Python.
För att anropa dessa "metoder", dvs funktioner, så måste du ha ditt "objekt", dvs struktur som argument.
Objektorientering handlar inte att man måste ha en specifik klass som liknar Java eller C++ eller Python.
För att anropa dessa "metoder", dvs funktioner, så måste du ha ditt "objekt", dvs struktur som argument.
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Du måste ju gå all in med dina strukt objektorientering och använda funktionspekare med.. då kan du ju få syntaxen att se objektorienterad med
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Jo. Jag vet. Men jag ville hålla det enkelt och minimalt efter behov
En fråga! Jag behöver lite hjälp med 2x5 JTAG. Vad ska jag ha? 1.27 eller 2.54?
Det är anslutning till adapterkortet på en ST-Link V2
En fråga! Jag behöver lite hjälp med 2x5 JTAG. Vad ska jag ha? 1.27 eller 2.54?
Det är anslutning till adapterkortet på en ST-Link V2
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Jag har några alternativ. Antingen köper jag en äkta ST-Link V2, eller så köper jag en ching-ching ST-Link V2 från Kina och sedan modifierar jag om så att 5V är SWO (Debugger). Vad rekommenderar ni? Detta är väll 2.54 på denna bild?
https://lujji.github.io/blog/stlink-clone-trace/
https://lujji.github.io/blog/stlink-clone-trace/
Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?
Ja det är 2.54mm
Alla nucleo kort innehåller en ST link som går att använda till egna kort med.
Alla nucleo kort innehåller en ST link som går att använda till egna kort med.