McMajan Library Pack  v 2.00
Improve your Arduino !
Ss_FastArduino.cpp
Go to the documentation of this file.
1 #include <Ss_FastArduino.h>
2 
3 #if defined FASTARDUINO_ON
4 
5 void f_FastdigitalWrite(uint8_t pin, uint8_t val)
6 {
7  uint8_t bit = digitalPinToBitMask(pin);
8  volatile uint8_t *out;
9  out = portOutputRegister(digitalPinToPort(pin));
10  if (val != LOW) *out |= (uint8_t)bit;
11  else *out &= ~(uint8_t)bit;
12 }
13 //==============================================================================
14 int f_FastdigitalRead(uint8_t pin)
15 {
16  uint8_t bit = digitalPinToBitMask(pin);
17  uint8_t port = digitalPinToPort(pin);
18  if (*portInputRegister(port) & bit) return HIGH;
19  return LOW;
20 }
21 
22 //==============================================================================
23 void f_FastshiftOut(const uint8_t dataPin, const uint8_t clockPin, const uint8_t val)
24 {
25  register uint8_t i;
26  register uint8_t tmp=128; //1<<7
27  uint8_t send;
28  for (i = 8; i ; i--)
29  {
30  send=((uint8_t)val &tmp);
31  f_FastdigitalWrite(dataPin,send); //MSBFIRST
32  f_FastdigitalWrite(clockPin, HIGH);
33  f_FastdigitalWrite(clockPin, LOW);
34  tmp=tmp>>1;
35  }
36 
37 }
38 //==============================================================================
39 /// @cond nodoxy
40 void f_FastDigitalPulse(uint8_t pin, uint8_t val)
41 {
42  uint8_t bit = digitalPinToBitMask(pin);
43  volatile uint8_t *out;
44  out = portOutputRegister(digitalPinToPort(pin));
45  if (val) {*out |= bit;*out &= ~bit;}
46  else {*out &= ~bit;*out |= bit;}
47 
48 }
49 /// @endcond
50 //==============================================================================
51 #else
52 // FASTARDUINO_ON NON DEFINITA =================================================
53 /// @cond nodoxy
54 void f1_FastDigitalPulse(uint8_t pin, uint8_t val)
55 {
56  FastdigitalWrite(pin,val);
57  FastdigitalWrite(pin,(!val));
58 }
59 /// @endcond
60 #endif
61 
62 /** \brief Set digital pin to low, then to high
63  * \param pin is the digital pin to send the pulse.
64  */
65 //==============================================================================
66 void LPulse(uint8_t pin)
67 {
68  FastdigitalWrite(pin,LOW);
69  FastdigitalWrite(pin,HIGH);
70 }
71 //==============================================================================
72 
73 /** \brief Set digital pin to high, then to low
74  * \param pin is the digital pin to send the pulse.
75  */
76 void HPulse(uint8_t pin)
77 {
78  FastdigitalWrite(pin,HIGH);
79  FastdigitalWrite(pin,LOW);
80 }
81 //==============================================================================
82 
83 /** \brief This function return n bit from a buffer
84  * \param buff is the buffer
85  * \param Fbit is the bit you want to extract (for example bit 54 from a char buffer)
86  * \return true or false
87  */
88 bool GetBitN(uint8_t * buff,unsigned int Fbit)
89 {
90  uint8_t byte,bit;
91  byte=Fbit>>3; //Fbit/8;
92  bit=Fbit-8*byte;
93  if (((*(buff+byte))&(1<<bit))==(1<<bit)) return(true);
94  else return(false);
95  //return (((*(buff+byte))&(1<<bit))==(1<<bit)); non testata ma dovrebbe sostituire correttamete le due righe di sopra
96 }
97 
98 //==============================================================================
99 //!Questa funzione setta l'n-esimo bit del buffer buff (0-n) (il singolo byte è riempito da destra a sinistra) con il valore val (0 o 1)
100 
101 /** \brief This function sets n bit in a buffer
102  * \param buff is the buffer
103  * \param Fbit is the bit you want to set (for example set bit 54 to tue)
104  * \param val true or false
105  */
106 void SetBitN(uint8_t * buff,unsigned int Fbit,bool val)
107 {
108  uint8_t byte,bit;
109  byte=Fbit>>3; //(bit/8)
110  bit=Fbit-8*byte;
111  *(buff+byte) = (*(buff+byte) & ~(1<<bit)) | (val << bit);
112 }
113 
114 //asm volatile("nop \n\t nop \n\t nop \n\t nop");
115 //asm volatile("jmp 0"); // restart
116 
117 /** \brief Calculate free RAM
118  * This function Works only on AVR microcontrollers
119  * \return bytes of free RAM
120  */
122 {
123  extern int __heap_start, *__brkval;
124  int v;
125  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
126  /* da provare per arduino 2
127  #include <malloc.h>
128 #include <stdlib.h>
129 #include <stdio.h>
130 
131 extern char _end; d
132 extern "C" char *sbrk(int i);
133 char *ramstart=(char *)0x20070000;
134 char *ramend=(char *)0x20088000;
135 
136 void setup() {
137  char *heapend=sbrk(0);
138  register char * stack_ptr asm ("sp");
139  struct mallinfo mi=mallinfo();
140  printf("\nDynamic ram used: %d\n",mi.uordblks);
141  printf("Program static ram used %d\n",&_end - ramstart);
142  printf("Stack ram used %d\n\n",ramend - stack_ptr);
143  printf("My guess at free mem: %d\n",stack_ptr - heapend + mi.fordblks);
144 }
145 
146 void loop() {
147 */
148 }
149 
150 
151 //==============================================================================
152 /** \brief This fill a buffer using random values
153  * \param arr is a float array pointer
154  * \param campioni is the number of element you want to fill
155  * \param media is the mean value of random values
156  * \param spered is the maximum spread value from mean value
157  */
158 void Mc_SetNoisyArray(float* arr,int campioni,float media,float spread)
159 {
160 randomSeed(millis()+analogRead(A0));
161 int ran,ran2;
162 ran=random(spread*2);
163 ran2=media-ran;
164 for(int i=0;i<campioni;i++)
165 {
166 int ran = random(spread*2-ran2);
167 ran2=media-ran;
168  *(arr+i)=media+ran-spread;
169 }
170 }
171 
172 
173 /*
174 void setPwmFrequency(int pin, int divisor) {
175  byte mode;
176  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
177  switch(divisor) {
178  case 1: mode = 0x01; break;
179  case 8: mode = 0x02; break;
180  case 64: mode = 0x03; break;
181  case 256: mode = 0x04; break;
182  case 1024: mode = 0x05; break;
183  default: return;
184  }
185  if(pin == 5 || pin == 6) {
186  TCCR0B = TCCR0B & 0b11111000 | mode;
187  } else {
188  TCCR1B = TCCR1B & 0b11111000 | mode;
189  }
190  } else if(pin == 3 || pin == 11) {
191  switch(divisor) {
192  case 1: mode = 0x01; break;
193  case 8: mode = 0x02; break;
194  case 32: mode = 0x03; break;
195  case 64: mode = 0x04; break;
196  case 128: mode = 0x05; break;
197  case 256: mode = 0x06; break;
198  case 1024: mode = 0x7; break;
199  default: return;
200  }
201  TCCR2B = TCCR2B & 0b11111000 | mode;
202  }
203 }*/
void HPulse(uint8_t pin)
Set digital pin to high, then to low.
bool GetBitN(uint8_t *buff, unsigned int Fbit)
This function return n bit from a buffer.
void LPulse(uint8_t pin)
Set digital pin to low, then to high.
#define FastdigitalWrite(a, b)
void Mc_SetNoisyArray(float *arr, int campioni, float media, float spread)
This fill a buffer using random values.
void SetBitN(uint8_t *buff, unsigned int Fbit, bool val)
Questa funzione setta l&#39;n-esimo bit del buffer buff (0-n) (il singolo byte è riempito da destra a sini...
void f1_FastDigitalPulse(uint8_t pin, uint8_t val)
int Mc_FreeRam()
Calculate free RAM This function Works only on AVR microcontrollers.