Pages: [1]   Go Down
Author Topic: Problema livello logico basso arduino Leonardo  (Read 317 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti!
Sto provando di programmare arduino leonardo per poter contare gli impulsi presenti ad un ingresso.
Ho settato il pin 2 come ingresso e e vi ho applicato un segnale da 0.2v a 5v.
Il pin 13 che è settato come uscita non commuta.

Tuttavia ho svariati dubbi generali:
 la tensione di ingresso VIL(tensione massima per livello logico basso) è di 0,1?pag 378 del datasheet.
Il led L sulla scheda cosa indica? Se lampeggia cosa significa?

Ho applicato due programmi
Code:
A)
[code]int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

B)
Code:
int out = 13;
int ingresso = 3;

void setup() {
  pinMode(out, OUTPUT);
  pinMode(ingresso,  INPUT);
}

void loop() {
   if(ingresso  == HIGH){
       digitalWrite(out, HIGH);     //fai blink
    }else{
       digitalWrite(out, LOW);
    }
}
Grazie in anticipo per le risposte[/code]
« Last Edit: November 21, 2013, 04:51:21 am by dariq88 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Provo a spiegare meglio il mio problema, voglio contare in un determinato tempo quanti impulsi arrivano su il pin di ingresso di arduino. La frequenza in ingresso varia dai 550Khz a circa10Hz con un range di tensioni di 200mv/500mv di minimo e 4,8/5V di massimo.
Ora con i programmi che ho fatto non riesco a capire se la scheda riesce a vedere il segnale in ingresso; ho pensato che le ragioni della nulla facenza della scheda possano essere:
1)Il segnale non raggiunge mai il livello logico basso
2)il segnale in ingresso è troppo veloce

Le mi domande nello specifico sono
1) la tensione Vil presente a pag 378 fa riferimeto Alla logica LVTTL che ha una tensione VIL di 0.8V poi subito sotto parla di una tensione di 0.1V come massima.Anche guardando la nota uno non riesco a capire quale delle due tensioni detti legge
2)Qual'è la frequenza di acquisizione dell'arduino?(in allegato il datasheet)
2)a Nel caso della gestione dei pin nel loop è il tempo che impiega a svolgere la funzione di loop?
2)b Nel caso,invece, in cui l'ingresso viene gestito a interrupt?


Grazie della pazienza, sono nuovo di questo ambiente e ho bisogno di qualche dritta

* 7766s.pdf (647.22 KB - downloaded 13 times.)
Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 102
Posts: 6538
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi usare la libreria Frequency Counter --> http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/
Per favore racchiudi il codice con gli appositi tag rieditando il tuo primo messaggio.
Segui le istruzioni al punto 7 --> http://forum.arduino.cc/index.php?topic=149082.0
« Last Edit: November 21, 2013, 04:38:44 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20166
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con alimentazione 5V il ATmega riconosce tensioni tra 0 e 1,5V come LOW e da 3 a 5V come HIGH.

digitalWrite() e digitalRead() sono funzioni abbastana lente percui la frequenza che puoi ottenere di sicuro non sono 550kHz.

Ciao Uwe
« Last Edit: November 25, 2013, 02:45:36 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie della risposta!
C'è un modo più veloce per aggiornare le uscite utilizzando i comandi normali senza sfociare nell'assembler?
Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 102
Posts: 6538
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, manipolando direttamente le porte.
--> http://arduino.cc/en/Reference/PortManipulation
--> http://www.skpang.co.uk/blog/archives/323

Ci sono delle macro già definite all'interno di Arduino.h.
Code: (Arduino.h)
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

oppure puoi usare le classiche cbi e sbi.
--> http://playground.arduino.cc/Main/AVR
« Last Edit: November 22, 2013, 06:45:29 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le librerie indicate nel sito http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/ sono specifiche per il micro atmel 328, solo che nel leonardo è presente il micro ATmega32u4, sapete se ne esistono delle altre? oppure devo andare a cambiare le configurazioni dei registri nella libreria?
Grazie per la pazienza
Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 102
Posts: 6538
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo è il topic della libreria --> http://forum.arduino.cc/index.php?topic=64219.msg708093#msg708093
E' stata modificata per farla funzionare con il MEGA. Per la Leonardo dovresti fare la stessa cosa, ovvero cambiare i nomi dei registri dei timer dal 328 o 2560 al 32U4. Fai riferimento ai due datasheet per trovare la differenze.

Oppure chiedi nel topic all'autore se la modifica lui o ne ha una già pronta ma non pubblicata.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie, io vengo adesso vedo di modificarla sperando di non metterci una vita se riesco poi posto smiley-lol
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao!ho provato a scrivere la libreria del freqcounter per arduino leonardo direi che dovrebbe essere corretta.

Code:
#include <FreqCounter.h>

unsigned long FreqCounter::f_freq;

volatile unsigned char FreqCounter::f_ready;
volatile unsigned char FreqCounter::f_mlt;
volatile unsigned int FreqCounter::f_tics;
volatile unsigned int FreqCounter::f_period;
volatile unsigned int FreqCounter::f_comp;

void FreqCounter::start(int ms) {

#if defined (__AVR_ATmega32U4__)//(__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || (__AVR_ATmega1280__)


    TIMSK0 &=~(1<<TOIE0);       // disable Timer0  //disable  millis and delay
    delayMicroseconds(50);      // wait if any ints are pending
   
    f_period=ms;
 
 
    if (f_comp ==0) f_comp=1;  // 0 is not allowed in del us

    // hardware counter setup ( refer atmega32u4)
    TCCR1A=0;                  // reset timer/counter1 control register A
    TCCR1B=0;                 // reset timer/counter1 control register A
    TCNT1=0;               // counter value = 0
TCNT3=0;
    // set timer/counter1 hardware as counter , counts events on pin T1 ( arduino pin 12)
    // normal mode, wgm10 .. wgm13 = 0
   
    TCCR1B |=  (1<<CS10) ;//CLOCK ESTERNO su fronte di salita
    TCCR1B |=  (1<<CS11) ;
    TCCR1B |=  (1<<CS12) ;
   
    // timer3 setup / usato per la generazione del tempo di lettura
    TCCR3A=0;
    TCCR3B=0;
   
    // timer3 presaler set to 128 / timer3 clock = 16Mhz / 256 = 62500 Hz
    TCCR3B |=  (1<<CS30) ;
    TCCR3B &= ~(1<<CS31) ;
    TCCR3B |=  (1<<CS32) ;

    //setta il timer3 to CTC(Clear Timer on Compare)  Mode with OCR3A is top counter value (arrivato a OCR3A si resetta)
    TCCR3A &= ~(1<<WGM30) ;
    TCCR3A &= ~(1<<WGM31) ;
    TCCR3A |=  (1<<WGM32) ;
TCCR3A &= ~(1<<WGM32) ;
    OCR3A = 124;                // CTC divider by 125
   
    f_ready=0;                  // reset period measure flag
    f_tics=0;                   // reset interrupt counter
    GTCCR = (1<<PSRASY);        // reset presacler counting (perchè resettarlo?)
    TCNT3=0;                    // timer3=0
    TCNT1=0;                    // Counter1 = 0
   
    TIMSK3 |=(1<<OCIE3A);       // enable Timer3 Interrupt (interrupt di Timer/Counter3 Compare Match A)
   
                                // External clock source on T1 pin. Clock on rising edge.
    TCCR1B |= (1<<CS12) | (1<<CS11) | (1<<CS10);        //   start counting now     
    #endif
}
//******************************************************************
//  Timer3 Interrupt Service is invoked by hardware Timer3 every 1ms = 1000 Hz
//  16Mhz/128/125 = 1000 Hz
//  here the gatetime generation for freq. measurement takes place:
//

ISR(TIMER3_COMPA_vect) {
// multiple 2ms = gate time = 100 ms
if (FreqCounter::f_tics >= FreqCounter::f_period) {         
                            // end of gate time, measurement ready

    // GateCalibration Value, set to zero error with reference frequency counter
    //  delayMicroseconds(FreqCounter::f_comp); // 0.01=1/ 0.1=12 / 1=120 sec
    delayMicroseconds(FreqCounter::f_comp);
    TCCR1B = TCCR1B & ~7;    // Gate Off  / Counter T1 stopped
    TIMSK2 &= ~(1<<OCIE3A);    // disable Timer3 Interrupt(timer del gate)
    TIMSK0 |=(1<<TOIE0);      // enable Timer0 again // millis and delay
    FreqCounter::f_ready=1;             // set global flag for end count period
   
                                        // calculate now frequeny value
    FreqCounter::f_freq=0x10000 * FreqCounter::f_mlt;  // mult #overflows by 65636
    FreqCounter::f_freq += TCNT1;      // add counter1 value
    FreqCounter::f_mlt=0;
   
    }
    FreqCounter::f_tics++;            // count number of interrupt events
    if (TIFR1 & 1) {          // if Timer/Counter 1 overflow flag
    FreqCounter::f_mlt++;               // count number of Counter1 overflows
    TIFR1 =(1<<TOV1);        // clear Timer/Counter 1 overflow flag
    }
    // PORTB = PORTB ^ 32;  // int activity test
}

Ho provato con questo programma a vedere se vede qualcosa, ma quel cavolo di led applicato al pin 4 no va!
Code:
#include <FreqCounter.h>

unsigned long frq;

int pinLed=4;

void setup() {
  pinMode(pinLed, OUTPUT);
}

void loop() {
  // wait if any serial is going on
  FreqCounter::f_comp=10;   // Cal Value / Calibrate with professional Freq Counter
  FreqCounter::start(100);  // 100 ms Gate Time

  while (FreqCounter::f_ready == 0)

  frq=FreqCounter::f_freq;
  if(frq>=100){
     digitalWrite(pinLed,HIGH);  // blink Led// PORTD |= 1<<pinLed;
  }else{
   digitalWrite(pinLed,LOW);// PORTD &= ~(1<<pinLed);
  }

Logged

Pages: [1]   Go Up
Jump to: