Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndLi
Inlägg: 17134
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av AndLi »

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..
Användarvisningsbild
AndLi
Inlägg: 17134
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av AndLi »

DanielM skrev: 2 november 2020, 13:45:29 Arduino använder egna bibliotek, men språket är C++. Inte C.
Baserat på C++ väl, main loop och annat är dolt någon stans bort från användaren?
H.O
Inlägg: 5715
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av H.O »

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/
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

AndLi skrev: 2 november 2020, 14:48:13
DanielM skrev: 2 november 2020, 13:45:29 Arduino använder egna bibliotek, men språket är C++. Inte C.
Baserat på C++ väl, main loop och annat är dolt någon stans bort från användaren?
Inte baserat på C++. Det är C++.

Main loop är bara funktioner från en header.
Mr Andersson
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?

Inlägg av Mr Andersson »

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.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

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.
Det är C++. Jag har själv skrivit om C++ bibliotek för Arduino till STM32 C kod.

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.
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av hummel »

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?
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

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:
  • * Privata funktioner
    * Deklerationer av objekt
    * Arv
    * Setters & Getters
Behöver man mer objekorientering? Nej :)

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.
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av hummel »

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?
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

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.
Användarvisningsbild
AndLi
Inlägg: 17134
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av AndLi »

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 :)
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

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
Användarvisningsbild
AndLi
Inlägg: 17134
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av AndLi »

1.27 är inte ovanligt...
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

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?
Bild

https://lujji.github.io/blog/stlink-clone-trace/
Användarvisningsbild
AndLi
Inlägg: 17134
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av AndLi »

Ja det är 2.54mm

Alla nucleo kort innehåller en ST link som går att använda till egna kort med.
Skriv svar