Skip to content

Commit 6c20b9a

Browse files
committed
Add PWM
1 parent f48fed0 commit 6c20b9a

File tree

7 files changed

+118
-10
lines changed

7 files changed

+118
-10
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
' 8 bit PWM with built-in LED
2+
3+
import teensy
4+
5+
const BuiltInLED = teensy.openAnalogOutput(13)
6+
7+
while(1)
8+
brightness++
9+
if(brightness > 255) then brightness = 0
10+
print brightness
11+
BuiltInLED.write(brightness)
12+
delay(10)
13+
wend
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
' 12 bit PWM with built-in LED
2+
' For frequency settings see https://www.pjrc.com/teensy/td_pulse.html
3+
4+
import teensy
5+
6+
const BuiltInLED = teensy.openAnalogOutput(13)
7+
8+
BuiltInLED.Frequency(36621.09)
9+
BuiltInLED.Resolution(12)
10+
11+
while(1)
12+
brightness++
13+
if(brightness > 4095) then brightness = 0
14+
print brightness
15+
BuiltInLED.write(brightness)
16+
delay(1)
17+
wend
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import teensy
2+
3+
while(1)
4+
ii++
5+
print ii
6+
delay(500)
7+
wend

src/platform/teensy/src/main.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,6 @@ void setup() {
9696
void serial_read() {
9797
bool eof = false;
9898
int lastRead = -1;
99-
100-
while(!Serial){
101-
delay(10);
102-
}
103-
104-
dev_print("Waiting for data... ");
105-
10699
buffer.clear();
107100

108101
while (!eof) {
@@ -116,6 +109,7 @@ void serial_read() {
116109
eof = true;
117110
} else {
118111
delay(250);
112+
dev_print("\rInteractive mode - waiting for data...");
119113
}
120114
}
121115
dev_printf("received %d bytes.\r\n", buffer.length());
@@ -186,7 +180,6 @@ extern "C" int main(void) {
186180
setup();
187181

188182
#if INTERACTIVE
189-
dev_print("Interactive mode enabled\r\n");
190183
interactive_main();
191184
#else
192185
if (!sbasic_main(MAIN_BAS)) {

src/platform/teensy/src/module.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,26 @@ int get_param_int(int argc, slib_par_t *params, int n, int def) {
4848
return result;
4949
}
5050

51+
double get_param_num(int argc, slib_par_t *params, int n, double def) {
52+
double result;
53+
if (n >= 0 && n < argc) {
54+
switch (params[n].var_p->type) {
55+
case V_INT:
56+
result = params[n].var_p->v.i;
57+
break;
58+
case V_NUM:
59+
result = params[n].var_p->v.n;
60+
break;
61+
default:
62+
result = def;
63+
break;
64+
}
65+
} else {
66+
result = def;
67+
}
68+
return result;
69+
}
70+
5171
const char *get_param_str(int argc, slib_par_t *params, int n, const char *def) {
5272
const char *result;
5373
static char buf[256];

src/platform/teensy/src/module.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ void error(var_p_t var, const char *field, int nMin, int nMax);
1313
void error(var_p_t var, const char *field, int n);
1414
void error(var_p_t var, const char *text);
1515
int get_param_int(int argc, slib_par_t *params, int n, int def);
16+
double get_param_num(int argc, slib_par_t *params, int n, double def);
1617
const char *get_param_str(int argc, slib_par_t *params, int n, const char *def);
1718
int get_int(var_t *v);
1819
int get_array_elem_int(var_p_t array, int index);

src/platform/teensy/src/teensy.cpp

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,14 @@ static int cmd_digitalinput_read(var_s *self, int argc, slib_par_t *arg, var_s *
138138
static int cmd_opendigitalinput(int argc, slib_par_t *args, var_t *retval) {
139139
int result = 1;
140140
int pin = get_param_int(argc, args, 0, -1);
141+
uint8_t mode = get_param_int(argc, args, 1, 1);
142+
if(mode) {
143+
mode = INPUT_PULLUP;
144+
} else {
145+
mode = INPUT;
146+
}
141147
if (is_pin(pin)) {
142-
set_pin(retval, pin, INPUT);
148+
set_pin(retval, pin, mode);
143149
v_create_callback(retval, "read", cmd_digitalinput_read);
144150
result = 1;
145151
} else {
@@ -174,6 +180,56 @@ static int cmd_opendigitaloutput(int argc, slib_par_t *args, var_t *retval) {
174180
return result;
175181
}
176182

183+
static int cmd_analogoutput_write(var_s *self, int argc, slib_par_t *arg, var_s *retval) {
184+
if (argc != 1 || !is_pin_object(self)) {
185+
error(retval, "AnalogOutput.write", 1);
186+
return 0;
187+
} else {
188+
int pin = self->v.m.id;
189+
int value = get_param_int(argc, arg, 0, 0);
190+
analogWrite(pin, value);
191+
}
192+
return 1;
193+
}
194+
195+
static int cmd_analogoutput_frequency(var_s *self, int argc, slib_par_t *arg, var_s *retval) {
196+
if (argc != 1 || !is_pin_object(self)) {
197+
error(retval, "AnalogOutput.frequency", 1);
198+
return 0;
199+
} else {
200+
int pin = self->v.m.id;
201+
double value = get_param_num(argc, arg, 0, 0.0);
202+
analogWriteFrequency(pin, value);
203+
}
204+
return 1;
205+
}
206+
207+
static int cmd_analogoutput_resolution(var_s *self, int argc, slib_par_t *arg, var_s *retval) {
208+
if (argc != 1 || !is_pin_object(self)) {
209+
error(retval, "AnalogOutput.resolution", 1);
210+
return 0;
211+
} else {
212+
int value = get_param_int(argc, arg, 0, 0);
213+
analogWriteResolution(value);
214+
}
215+
return 1;
216+
}
217+
218+
static int cmd_openanalogoutput(int argc, slib_par_t *args, var_t *retval) {
219+
int result;
220+
int pin = get_param_int(argc, args, 0, -1);
221+
if (is_pin(pin)) {
222+
set_pin(retval, pin, OUTPUT);
223+
v_create_callback(retval, "write", cmd_analogoutput_write);
224+
v_create_callback(retval, "frequency", cmd_analogoutput_frequency);
225+
v_create_callback(retval, "resolution", cmd_analogoutput_resolution);
226+
result = 1;
227+
} else {
228+
result = 0;
229+
}
230+
return result;
231+
}
232+
177233
static int cmd_get_temperature(int argc, slib_par_t *args, var_t *retval) {
178234
v_setint(retval, tempmonGetTemp());
179235
return 1;
@@ -406,10 +462,11 @@ static FuncSpec lib_func[] = {
406462
{0, 0, "GETTEMP", cmd_get_temperature},
407463
{0, 0, "GETCPUSPEED", cmd_get_cpu_speed},
408464
{1, 1, "OPENANALOGINPUT", cmd_openanaloginput},
465+
{1, 1, "OPENANALOGOUTPUT", cmd_openanalogoutput},
409466
{1, 1, "OPENDIGITALINPUT", cmd_opendigitalinput},
410467
{1, 1, "OPENDIGITALOUTPUT", cmd_opendigitaloutput},
411468
{0, 1, "OPENSERIAL", cmd_openserial},
412-
{0, 1, "OPENI2C", cmd_openi2c}
469+
{0, 3, "OPENI2C", cmd_openi2c}
413470
};
414471

415472
static int teensy_func_count(void) {

0 commit comments

Comments
 (0)