Arduino MEGA328 zdielanie pinu SS/OC1B

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Ivan_Ryger
Pokročilý člen
Pokročilý člen
Príspevky: 574
Dátum registrácie: 01 Apr 2008, 00:00
Bydlisko: Bratislava, Petržalka

Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa Ivan_Ryger » 27 Jún 2018, 00:54

Ahojte, prosím vedel by mi niekto poradiť, či je možné na Arduine zakázať SPI slave na to, aby som mohol pin DDB2 použiť pre PWM výstup?
Skúšal som zapísať do SPI control registra bit MSTR, no Arduino tento register nerozpoznáva.
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa stefanSK » 27 Jún 2018, 06:40

vyskúšal som pre ArduinoUno a tiež pre Arduino Nano:

SPCR = 1<<MSTR;

a preložilo to bez chyby.
0
S.K.

Ivan_Ryger
Pokročilý člen
Pokročilý člen
Príspevky: 574
Dátum registrácie: 01 Apr 2008, 00:00
Bydlisko: Bratislava, Petržalka

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa Ivan_Ryger » 27 Jún 2018, 15:22

Štefan, to som práve skúšal, no stále nemám signál na výstupe, aj keď prepínam PORTB2 vo while slučke.
Ivan

-- Spojený príspevok 27 Jún 2018, 15:08 --

Tak, štefan, záhada vyriešená.
Toto je záhada, dnes ráno som skompiloval kód znova a nahral ho. A pracuje.
Možno som neúmyselne niečo odkomentoval?

Ten problém s PORTB2 sa vyriešil nasledovne: môj osciloskop mal zrejme problém so synchronizáciou na krátke pulzy, preto 1us pulzy vzdialené cca 1ms nevedel zachytiť a nebolo ich ani vidieť.

Kód: Vybrať všetko

//Arduino Mega 328
// XTAL 16.000 MHz
/* Arduino notation*/
//#define CLOCK     12      // PB4
//#define TRIGGER   11      // PB3

/*AVR C notation*/
#define CLOCK     DDB4      // PB4 - PORT B (pin 12 Arduino)
#define TRIGGER   DDB3      // PB3 - PORT B (pin 11 Arduino)

unsigned int u16_PulseWidth = 100;// n + 1 clock cycles lasting reset pulse, minimum value is 1 (+1) = 2 clock pulses 

void setup()
{
  cli(); // disable interrrupts
  
  
  // TIMER 0 generating the square wave M_CLOCK signal- output toggles, when timer value match with OCR0A occurs
  TCCR0A = (1 << WGM01)|(1<<COM0A0); 
  /*
  WGM0[1]=1 Waveform Generation Mode: CTC clear timer on compare to OCR0A match- auto reload,
  COM0A[0]=1 toggle the OCnX register at match
  period of the square wave f_OCnx = fclkIO / ( 2 * N * (1+OCRnx))
    */
  TCCR0B = 1 << CS01 ; 
  /* 
  the clock source is selected by writing to the CLock Select CS0[2:0] bits in the Timer/Counter COntrol Register TCCR0B
  CS0[1] CLK = CLK_IO/8 
  */            
  OCR0A = 24; // set the compare unit to 24, every 25.th clock strike will the counter be reset.
  
  
  // TIMER 1 generating the M_RESET triggering pulse 
  /*
  Fast PWM mode- non-inverting compare output mode  OCnx is set to 1 at BOTTOM, cleared on compare match to OCR1B
  */
  //(1 << WGM12)//CTC mode, TOP OCR1A
  
  TCCR1A = (1 << COM1B1) | (3 << WGM10);
  TCCR1B = (3 << WGM12)  | (1 << CS11);
  /*
  COM1B[1:0] = 0x02 non-inverted PWM output from OC1B register
  WGM1[3:0] = 0x0F - fast PWM mode, TOP is OCR1A
  CS1[1:0] = 0x02 - clkIO/8 prescaler
  */
  
  OCR1A = 6750;
  OCR1B = u16_PulseWidth;
  //sei();                  

  DDRD = (1 << DDD6);// PD6 OC0A pin set as a CLK_M square wave output PIN6 Arduino
  SPCR = (1 << MSTR);
  DDRB = (1 << DDB2);// PB2, OC1B set as a RESET_M signal output PIN10 Arduino
 
}
/*
/* The 8-bt comparator continuosuly compares TCNT0 with the Output Compare REgisters OCR0A, OCR0B.
 *  Whenever TCNT0 equals OCR0A or OCR0B, the comparator signals a match. THe match will set the Output Compare Flag OCF0A or OCF0B
 *  at the next timer clock cycle. If the corresponding interrupt is enabled, the output compare flag generates an output compare interrupt.
*/
/*
 * Clear timer on Compare Match- CTC mode. IN Clear Timer on Compare  mode (WGM0[2:0] = 0x02), the OCR0A Register is used 
 * to manipulate the counter resolution.The counter ic cleared to ZERO when the counter u8_port_signal TCNT0 matches teh OCR0A. The OCR0A defineds the top u8_port_signal 
 * for the counter, hence its resolution. THis mode allows greater control of the compare match output frequency.
 * f_OC0A= fCLK_IO/(2*N*(1+OCRNX))
 * 
*/


void loop()
{
  /*
  PORTB = (1 << PB2);
  delay(1);
  PORTB = 0;
  delay(1);*/
}

0

Ivan_Ryger
Pokročilý člen
Pokročilý člen
Príspevky: 574
Dátum registrácie: 01 Apr 2008, 00:00
Bydlisko: Bratislava, Petržalka

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa Ivan_Ryger » 27 Jún 2018, 16:25

Teraz prichádza ďalšia hádanka.

Mám bežiace 2 PWM kanály, jeden generuje obdĺžnik na 40 kHz a druhý generuje krátke ihlovité pulzy, povedzme 1us široké každých 270 cyklov 40kHz obdĺžnika. Záhadou mi je, prečo na osciloskope sa javia tieto dva kanály, akoby boli nesynchrónne a bežali z dvoch rôznych hodinových zdrojov.
0

Používateľov profilový obrázok
rudko
Power user
Power user
Príspevky: 2339
Dátum registrácie: 28 Dec 2012, 08:33
Vek: 37

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa rudko » 27 Jún 2018, 16:32

skus ich len tak zo srandy zavesit cez dve diody na jeden vstup osciloskopu. tak zistis ci je chyba v nastaveni skopu, alebo je to naozaj "rozladene"
0
Drink coffee. Do stupid things faster with more energy...

Ivan_Ryger
Pokročilý člen
Pokročilý člen
Príspevky: 574
Dátum registrácie: 01 Apr 2008, 00:00
Bydlisko: Bratislava, Petržalka

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa Ivan_Ryger » 27 Jún 2018, 19:53

Dakujem, Rudko. Vyskusam a dam vediet.
I.
0

kamilko
Stály člen
Stály člen
Príspevky: 269
Dátum registrácie: 21 Okt 2017, 14:07
Bydlisko: kosice

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa kamilko » 27 Jún 2018, 19:53

Ako vies ze ti to arduino nevuuziva timer toho tvojho pwm na svoje ucely?

Uz to zahod a prejdi na normalne ccko lebo sa budes trapit presne na takychto blbostiach.
0

Ivan_Ryger
Pokročilý člen
Pokročilý člen
Príspevky: 574
Dátum registrácie: 01 Apr 2008, 00:00
Bydlisko: Bratislava, Petržalka

Re: Arduino MEGA328 zdielanie pinu SS/OC1B

Príspevok od používateľa Ivan_Ryger » 27 Jún 2018, 19:58

Urobil som to cez dva rezistory a vyzerá to tak, že skutočne priebeh (1us/ 3.375ms) pulzuje. Jeho perióda sa nemení, no vyzerá to tak, akoby sa jeho fáza voči referenčnému 40kHz signálu posúvala.

EDIT, ďakujem za nakopnutie.
Zistil som, že som mal zlý deliaci pomer. Celkovo mal byť 6750, to znamená, že hodnota registra TCCR1A mala byť nastavená na 6749.
Teraz je všetko tak, ako má byť.

Ďakujem Vám páni za pomoc.

Ivan
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok