| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 | 
							- /*
 
-   u8g_delay.c
 
-   Universal 8bit Graphics Library
 
-   
 
-   Copyright (c) 2011, olikraus@gmail.com
 
-   All rights reserved.
 
-   Redistribution and use in source and binary forms, with or without modification, 
 
-   are permitted provided that the following conditions are met:
 
-   * Redistributions of source code must retain the above copyright notice, this list 
 
-     of conditions and the following disclaimer.
 
-     
 
-   * Redistributions in binary form must reproduce the above copyright notice, this 
 
-     list of conditions and the following disclaimer in the documentation and/or other 
 
-     materials provided with the distribution.
 
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
 
-   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 
-   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 
-   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 
-   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
 
-   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
 
-   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 
-   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 
-   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 
-   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 
-   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 
-   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 
-   void u8g_Delay(uint16_t val)		Delay by "val" milliseconds
 
-   void u8g_MicroDelay(void)		Delay be one microsecond
 
-   void u8g_10MicroDelay(void)	Delay by 10 microseconds
 
-   
 
- */
 
- #include "u8g.h"
 
- /*==== Part 1: Derive suitable delay procedure ====*/
 
- #if defined(ARDUINO)
 
- #  if ARDUINO < 100 
 
- #    include <WProgram.h> 
 
- #  else 
 
- #    include <Arduino.h> 
 
- #  endif
 
- #  if defined(__AVR__)
 
- #    define USE_AVR_DELAY
 
- #  elif defined(__PIC32MX)
 
- #    define USE_PIC32_DELAY
 
- #  elif defined(__arm__)		/* Arduino Due & Teensy */
 
- #    define USE_ARDUINO_DELAY
 
- #  else
 
- #    define USE_ARDUINO_DELAY
 
- #  endif
 
- #elif defined(U8G_RASPBERRY_PI)
 
- #  define USE_RASPBERRYPI_DELAY
 
- #elif defined(__AVR__)
 
- #  define USE_AVR_DELAY
 
- #elif defined(__18CXX)
 
- #  define USE_PIC18_DELAY
 
- #elif defined(__arm__)
 
- /* do not define anything, all procedures are expected to be defined outside u8glib */
 
- /*
 
- void u8g_Delay(uint16_t val);
 
- void u8g_MicroDelay(void);
 
- void u8g_10MicroDelay(void);
 
- */
 
- #else
 
- #  define USE_DUMMY_DELAY
 
- #endif
 
- /*==== Part 2: Definition of the delay procedures ====*/
 
- /*== Raspberry Pi Delay ==*/
 
- #if defined (USE_RASPBERRYPI_DELAY)
 
- #include <wiringPi.h>
 
- //#include "/usr/local/include/wiringPi.h"
 
- void u8g_Delay(uint16_t val) {
 
-    //delay(val);
 
-    //usleep((uint32_t)val*(uint32_t)1000);
 
-    delayMicroseconds((uint32_t)val*(uint32_t)1000);
 
- }
 
- void u8g_MicroDelay(void)
 
- {
 
-    usleep(1);
 
- }
 
- void u8g_10MicroDelay(void)
 
- {
 
-    usleep(10);
 
- }
 
- #endif
 
- /*== AVR Delay ==*/
 
- #if defined(USE_AVR_DELAY)
 
- #include <avr/interrupt.h>
 
- #include <avr/io.h>
 
- #include <util/delay.h>
 
- /*
 
-   Delay by the provided number of milliseconds.
 
-   Thus, a 16 bit value will allow a delay of 0..65 seconds
 
-   Makes use of the _delay_loop_2
 
-   
 
-   _delay_loop_2 will do a delay of n * 4 prozessor cycles.
 
-   with f = F_CPU cycles per second,
 
-   n = f / (1000 * 4 )
 
-   with f = 16000000 the result is 4000
 
-   with f = 1000000 the result is 250
 
-   
 
-   the millisec loop, gcc requires the following overhead:
 
-   - movev 1
 
-   - subwi 2x2
 
-   - bne i 2
 
-   ==> 7 cycles
 
-   ==> must be devided by 4, rounded up 7/4 = 2
 
- */
 
- void u8g_Delay(uint16_t val)
 
- {
 
-   /* old version did a call to the arduino lib: delay(val); */
 
-   while( val != 0 )
 
-   {
 
-     _delay_loop_2( (F_CPU / 4000 ) -2);
 
-     val--;
 
-   }
 
- }
 
- /* delay by one micro second */
 
- void u8g_MicroDelay(void)
 
- {
 
- #if (F_CPU / 4000000 ) > 0 
 
-   _delay_loop_2( (F_CPU / 4000000 ) );
 
- #endif
 
- }
 
- /* delay by 10 micro seconds */
 
- void u8g_10MicroDelay(void)
 
- {
 
- #if (F_CPU / 400000 ) > 0 
 
-   _delay_loop_2( (F_CPU / 400000 ) );
 
- #endif
 
- }
 
- #endif 
 
- /*== Delay for PIC18 (not tested) ==*/
 
- #if defined(USE_PIC18_DELAY)
 
- #include <delays.h>
 
- #define GetSystemClock()		(64000000ul)      // Hz
 
- #define GetInstructionClock()	(GetSystemClock()/4)
 
- void u8g_Delay(uint16_t val)
 
- {/*
 
- 	unsigned int _iTemp = (val);
 
- 	while(_iTemp--)		
 
- 		Delay1KTCYx((GetInstructionClock()+999999)/1000000);
 
- 		*/
 
- }
 
- void u8g_MicroDelay(void)
 
- {
 
-   /* not implemented */
 
- }
 
- void u8g_10MicroDelay(void)
 
- {
 
-   /* not implemented */
 
- }
 
- #endif
 
- /*== Arduino Delay ==*/
 
- #if defined(USE_ARDUINO_DELAY)
 
- void u8g_Delay(uint16_t val)
 
- {
 
- #if defined(__arm__)
 
- 	delayMicroseconds((uint32_t)val*(uint32_t)1000);
 
- #else
 
- 	delay(val);
 
- #endif
 
- }
 
- void u8g_MicroDelay(void)
 
- {
 
- 	delayMicroseconds(1);
 
- }
 
- void u8g_10MicroDelay(void)
 
- {
 
- 	delayMicroseconds(10);
 
- }
 
- #endif
 
- #if defined(USE_PIC32_DELAY)
 
- /* 
 
-   Assume chipkit here with F_CPU correctly defined
 
-   The problem was, that u8g_Delay() is called within the constructor.
 
-   It seems that the chipkit is not fully setup at this time, so a
 
-   call to delay() will not work. So here is my own implementation.
 
- */
 
- #define CPU_COUNTS_PER_SECOND (F_CPU/2UL)
 
- #define TICKS_PER_MILLISECOND  (CPU_COUNTS_PER_SECOND/1000UL)
 
- #include "plib.h"
 
- void u8g_Delay(uint16_t val)
 
- {
 
- 	uint32_t d;
 
- 	uint32_t s;
 
- 	d = val;
 
- 	d *= TICKS_PER_MILLISECOND;
 
- 	s = ReadCoreTimer();
 
- 	while ( (uint32_t)(ReadCoreTimer() - s) < d )
 
- 		;
 
- } 
 
- void u8g_MicroDelay(void)
 
- {
 
- 	uint32_t d;
 
- 	uint32_t s;
 
- 	d = TICKS_PER_MILLISECOND/1000;
 
- 	s = ReadCoreTimer();
 
- 	while ( (uint32_t)(ReadCoreTimer() - s) < d )
 
- 		;
 
- } 
 
- void u8g_10MicroDelay(void)
 
- {
 
- 	uint32_t d;
 
- 	uint32_t s;
 
- 	d = TICKS_PER_MILLISECOND/100;
 
- 	s = ReadCoreTimer();
 
- 	while ( (uint32_t)(ReadCoreTimer() - s) < d )
 
- 		;
 
- } 
 
- #endif
 
- /*== Any other systems: Dummy Delay ==*/
 
- #if defined(USE_DUMMY_DELAY)
 
- void u8g_Delay(uint16_t val)
 
- {
 
- 	/* do not know how to delay... */
 
- }
 
- void u8g_MicroDelay(void)
 
- {
 
- }
 
- void u8g_10MicroDelay(void)
 
- {
 
- }
 
- #endif
 
 
  |